Python 獲取2個字串的最長公共子串

2021-09-02 05:47:09 字數 2842 閱讀 5586

計畫是這樣的:

查詢所有pdfpdf名字建立資料夾,並將對應的pdf檔案,移入資料夾中;

查詢與pdf名字最接近的***檔案,並將其移入對應的資料夾中。

看到明顯是一本書的文字音訊資料

可以發現,他們都有相同的子字串,所以先要處理找兩個字串最長公共子串的問題

:# 求兩個字串的最長公共子串

# 思想:建立乙個二維陣列,儲存連續位相同與否的狀態

len_s1 =

len(s1)

len_s2 =

len(s2)

# 生成0矩陣,為方便後續計算,多加了1行1列

# 行: (len_s1+1)

# 列: (len_s2+1)

record =[[

0for i in

range

(len_s2+1)

]for j in

range

(len_s1+1)

]

maxnum =

0# 最長匹配長度

p =0# 字串匹配的終止下標

for i in

range

(len_s1)

:for j in

range

(len_s2)

:if s1[i]

== s2[j]

:# 相同則累加

record[i+1]

[j+1

]= record[i]

[j]+

1if record[i+1]

[j+1

]> maxnum:

maxnum = record[i+1]

[j+1

] p = i # 匹配到下標i

# 返回 子串長度,子串

return maxnum, s1[p+

1-maxnum : p+1]

defprintmatrixlist

(li)

:# 列印多維list

row =

len(li)

col =

len(li[0]

)for i in

range

(row)

:for j in

range

(col)

:print

(li[i]

[j], end=

' ')

print(''

)if __name__ ==

"__main__"

:# s1="黑貓英語名著3級 02 alic's adventures in wonderland 艾麗絲漫遊奇境記.pdf"

# s2="艾麗絲漫遊奇境記 alic_s adventures in wonderland 01.***"

s1='abcdef'

s2='bcxdef'

[lenmatch,strmatch]

= getmaxcommonsubstr(s1,s2)

print

('子串: '

, strmatch)

print

('子串長度: '

, lenmatch)

# 如果資料是`abcdef`等

子串: def

子串長度: 3

# 如果資料是`艾麗絲`等

子串: s adventures in wonderland

子串長度: 27

對於測試字串為:

s1=

'abcdef'

s2='bcxdef'

明顯看出有2個公共子串,bcdef,上述的方法就是用2個字串各自的長度建立了乙個矩陣,矩陣數值初始都是0,乙個字元乙個字元的進行對比,如果字元相等,就在左上對角線元素的數值上加一(如下面所示)。

假設字串長度分別為nm,則建立這個矩陣的時候,演算法複雜度為o(nm),查詢最大子串的演算法複雜度為o(nm),整體演算法的複雜度為2o(nm)

理論上,可以把建立矩陣和查詢放在一起,這樣就會優化許多,等我閒了再搞吧,先完成主要目標。

0 b c x d e f

a 0000

00b 1000

00c 0200

00d 0001

00e 0000

20f 0000

03

最終不要忘了初心

[python]將***和pdf按名字分類歸檔到各自資料夾 :

以上,enjoy~

n個字串找出重複最多的前十個字串

使用優先佇列構建最小堆,不用使用vector陣列再排序,優先佇列詳解 優先佇列和queue不同的就在於我們可以自定義其中資料的優先順序,讓優先順序高的排在佇列前面,優先出隊,優先佇列具有佇列的所有特性,包括基本操作,只是在這基礎上新增了內部的乙個排序,它本質是乙個堆實現的 include stdaf...

java獲取乙個字串在另乙個字串中出現的次數

獲取乙個字串在另乙個字串中出現的次數。abkkcdkkefkkskk 思路 1,定義個計數器。2,獲取kk第一次出現的位置。3,從第一次出現位置後剩餘的字串中繼續獲取kk出現的位置。每獲取一次就計數一次。4,當獲取不到時,計數完成。class stringtest2 return count 練習三...

js如何獲取乙個字串在另外乙個字串中的下標

有字串 a 34 b 123456789 要求定義乙個函式返回b字串中第乙個匹配a字串的下標,不得使用現有的方法 indexof 兩種解決辦法 substr 方法可在字串中抽取從 start 下標開始的指定數目的字元。const b,a return 1 let a 34 let b 1234567...