1. 程式人生 > 資訊 >收購總價 70 億美元,Coherent 買主確定,光器件龍頭企業 II-VI 笑到最後

收購總價 70 億美元,Coherent 買主確定,光器件龍頭企業 II-VI 笑到最後

試題 G: 重複字串

【問題描述】
如果一個字串 S 恰好可以由某個字串重複 K 次得到,我們就稱 S 是 K 次重複字串。例如 “abcabcabc” 可以看作是 “abc” 重複 3 次得到,所以“abcabcabc” 是 3 次重複字串。
同理 “aaaaaa” 既是 2 次重複字串、又是 3 次重複字串和 6 次重複字串。
現在給定一個字串 S,請你計算最少要修改其中幾個字元,可以使 S 變為一個 K 次字串?
【輸入格式】
輸入第一行包含一個整數 K。
第二行包含一個只含小寫字母的字串 S。
【輸出格式】
輸出一個整數代表答案。如果 S 無法修改成 K 次重複字串,輸出 1。
【樣例輸入】

2
aabbaa
【樣例輸出】
2

思路:
因為他是要求重複字串,len(s)%k!=0 就無法完成上述要求那麼就輸出1。我們想把S 修改成 K 次重複字串,就是求最優解,我可以先分成k份來看字元,意思就是讓k份是一樣的字元。
如何以最少修改字元呢?
在這裡插入圖片描述

我們可以把每份的對應一列的字元儲存到d列表中,那麼我們如何把每份對應列儲存起來呢?
我們可以看每份的字串長度為多少,m=len(s)//k ,所以我們就可以把那個看成m列長度的d。q求每一列就可以利用for迴圈來完成,比如:
for i in range(0,10,3):
i依次為 0,3,6,9

我們想要修改字元最少,那麼就是每列的修改次數最少,我們從中可以看到如果一列中每個字母出現次數越多那麼我們就可以修改成那個最多的字母,

可以用 get 計數並用 sort 排序就可以得到,這樣我們的修改次數就是最小,所以我們就把當前這列的出現次數最多的字元找出來然後這個列的長度減去最多次數就是修改次數最少c+=k-max(x),因為我們只算出一列的,然後在算出剩餘列的相加就可以得到對應解了。

程式:

k=int(input())
s=input()
q1=0   #總修改次數
m=len(s)//k
if len(s)%k!=0:
     print("1")
else:
     for i in range(m):   #依次歷遍列
          d={}
          for j in range
(i,len(s),m): #依次歷遍每列並計數 d[s[j]]=d.get(s[j],0)+1 d=list(d.items()) d.sort(key=lambda k:k[1]) q1+=k-d[-1][1] #加上 總數減去最大重複字元數 print(q1)

————————————————
借鑑了他的
原文連結:https://blog.csdn.net/weixin_46640345/article/details/112426954