1. 程式人生 > >演算法題2:統計字串A中長度為k的子串在字串B中出現的總次數

演算法題2:統計字串A中長度為k的子串在字串B中出現的總次數

問題:

  1. 輸入一個正整數 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)