日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cstring查找子字符串_动态规划6:两个字符串的最长连续公共子串

發布時間:2025/3/19 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cstring查找子字符串_动态规划6:两个字符串的最长连续公共子串 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文和前一篇:動態規劃5-兩個字符串的最長公共子序列類似,但公共子串必須是連續的,子序列不需要連續

字符串a,長度為m:a[1].a[2].a[3].a[4]....a[m]

字符串b,長度為n:b[1].b[2].b[3].b[4]....b[n]

比如字符串a:abcbced;字符串b:acbcbcef則這兩個字符串的最長公共子串長度為3,最長公共子串是:BCD,必須連續

1.一般的思路,雙重for循環,操作字符串a,1)a在不在字符串b中,ab在不在字符串b中,abc在不在字符串b中,abcb在不在字符串b中,abcbc在不在字符串b中,abcbce在不在字符串b中,abcbcd在不在字符串b中;2)b在不在字符串b中,bc在不在字符串b中,bcb在不在字符串b中,bcbc在不在字符串b中,bcbce在不在字符串b中,bcbced在不在字符串b中......綜上比較出一個最大值出來;缺點:時間復雜度高

2.把兩個字符串分別以行和列組成一個二維矩陣,比較二維矩陣中每個點對應行列字符中否相等,相等的話值設置為1,否則設置為0

如果字符串a和字符串b完全一樣,那二維矩陣正中間的對象線全是1,最長公共子串長度就為字符串的長度。

如果字符串a和字符串b完全不一樣,那二維矩陣中的值全是0,沒有公共部分。

如果字符串a和字符串b不完全一樣,怎么辦呢?通過查找出值為1的最長對角線就能找到最長公共子串,也就是上圖中的紅色箭頭,為什么是這樣子的呢?再看一下上圖,多想想就明白了

為了進一步優化算法的效率,在計算某個二維矩陣的值的時候順便計算出來當前最長的公共子串的長度,即某個二維矩陣元素的值由dp[i][j]=1演變為dp[i][j]=1+dp[i-1][j-1],這樣就避免了后續查找對角線長度的操作了。修改后的二維矩陣如下:

遞推公式為:

當A[i] != B[j],dp[i][j] = 0

當A[i] == B[j],dp[i][j] = dp[i - 1][j - 1] + 1

同樣,有初始值和遞推方程,就可以求出最大長度值,進而求出對應的最長公共子串

總結

以上是生活随笔為你收集整理的cstring查找子字符串_动态规划6:两个字符串的最长连续公共子串的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。