昨天装了一天的linux和Qt,鸽了,今天复工。
试题 历届真题 重复字符串【第十一届】【决赛】【A组】
我的思路就是,把这个字符串等分k份,依次以每一小子串为基准,统计剩余子串变为当前子串需要改变的字母个数。代码如下,只能通过40%。
import sys
k = int(input()) # 重复k
s = input() # 字符串
lens = len(s) # 字符串长度
# 能否被k整除,不能就返回-1
if lens%k == 0:
pass
else:
print(-1)
sys.exit()
s = list(s)
# 字串长度
lens2 = int(lens/k)
mint = 1000000
for i in range(k):
tmp = s[i*lens2:i*lens2 + lens2] # 以第一段为子串
count = 0
for j in range(k):
now = s[j*lens2:j*lens2 + lens2]
for x in range(lens2):
if now[x] != tmp[x]:
count = count+1
mint = min(count,mint)
print(mint)
这种情况考虑的太简单,如果对每个子串进行统计,选出每一位上出现频率最高的字母,这些字母组成的子串可能最简。思路就是建立一个字典,按下图所示,对每个子串对应位置字母进行统计
最后,选每一组出现频率最高的字母组合在一起,形成目标子串。
接下来,每一个子串都按照这个目标子串改变自身的字母,统计改变个数就可以实现要求。
改进代码如下,正确率达到100%,美滋滋
import sys
k = int(input()) # 重复k
s = input() # 字符串
lens = len(s) # 字符串长度
s = list(s)
# 字串长度
lens2 = int(lens/k)
target = ''
for j in range(lens2):
dic = {}
for i in range(k):
if s[j+i*lens2] in dic:
dic[s[j+i*lens2]] += 1
else:
tmpdic = {s[j+i*lens2]:1}
dic.update(tmpdic)
tmplist = sorted(dic.items(), key=lambda item:item[1], reverse=True)
target += tmplist[0][0]
target = list(target)
count = 0
for i in range(k):
tmp = s[i*lens2:i*lens2+lens2]
for j in range(lens2):
if target[j] == tmp[j]:
pass
else:
count = count + 1
print(count)