演算法題2:統計字串A中長度為k的子串在字串B中出現的總次數
阿新 • • 發佈:2018-11-08
問題:
- 輸入一個正整數 k,一個字串 A和字串B,統計A中長度為k的子串在B中出現的總次數,輸出總次數。
例如:k=2, A =’abba’, B=’abbaab’,則A的長度為2 的子串有 [‘ab’,’bb’,’ba’],它們在B中出現的次數分別為2、1、1,所以輸出4
思路:
思路1:獲取A長度為k的所有字串,去重,統計每個字串在B中的出現次數,再求和
思路2:獲取B的所有長度為k的字串,不去重,然後把A的字串(去重)與B的字串(未去重)進行匹配
獲取A的所有子串的方法
# i控制起點, j控制偏移量 # 不會寫的時候,先把數學邏輯(開始、結束範圍)在紙上寫出來,然後根據語言的語法進行轉換,接著用demo檢驗正確性 # i的值域:0-len(A); j的值域:1-(len(A)-i) substr_of_A = [ A[i:i+j] for i in range(len(A)) for j in range(1, len(A)-i+1) ] # 求B的子串並去重 substr_of_B = set( [ B[i:i+j] for i in range(len(B)) for j in range(1, len(B)-i+1) ] )
測試結果:
程式碼:
import sys if __name__=='__main__': data = [] for i in range(3): line = sys.stdin.readline() data.append(line.strip()) k = int(data[0]) A = str(data[1]) B = str(data[2]) # i的取值範圍為:開頭(0)到 len(A)-k;用 set 去重 substr_k_of_A = set( [ A[i:i+k] for i in range(len(A)-k+1) ] ) num_substr = 0 # 寫法一(用string的count函式) # for item in substr_k_of_A: # t = B.count(item) # 用字串物件函式查詢B中出現item的次數 # num_substr += t # print(num_substr) # 寫法二(用自己定義的for迴圈) for item in substr_k_of_A: t = 0 # 統計每個字串在B中出現的次數 for j in range(len(B)-k+1): if B[j:j+k]==item: t += 1 num_substr += t print(num_substr)