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:两个字符串的最长连续公共子串的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python怎么筛选excel数据_Py
- 下一篇: python 笔试题 英方_经典算法题