最長公共子串 C語言 動態規劃

2021-10-03 07:41:54 字數 1238 閱讀 9506

給定兩個字串 text1 和 text2,返回這兩個字串的最長公共子串行。

乙個字串的 子串行

是指這樣乙個新的字串:它是由原字串在不改變字元的相對順序的情況下刪除某些字元(也可以不刪除任何字元)後組成的新字串。 例如,「ace」

是 「abcde」 的子串行,但 「aec」 不是 「abcde」 的子串行。兩個字串的「公共子串行」是這兩個字串所共同擁有的子串行。

若這兩個字串沒有公共子串行,則返回 0。

示例 1:

輸入:text1 = 「abcde」, text2 = 「ace」 輸出:3 解釋:最長公共子串行是 「ace」,它的長度為 3。

示例 2:

輸入:text1 = 「abc」, text2 = 「abc」 輸出:3 解釋:最長公共子串行是 「abc」,它的長度為 3。 示例 3:

輸入:text1 = 「abc」, text2 = 「def」 輸出:0 解釋:兩個字串沒有公共子串行,返回 0。

1 <= text1.length <= 1000 1 <= text2.length <= 1000 輸入的字串只含有小寫英文本元。

int

longestcommonsubsequence

(char

* text1,

char

* text2)

last = temp;}}

return dp[len2]

;}

題解 :引用自領扣amos123的題解,

1.dp方程: dp[i][j]=dp[i-1][j-1]+1; //text1[i-1]==text2[j-1] dp[i][j]=max(dp[i][j],dp[i][j-1]); //text1[i-1]!=text2[j-1]

2.在利用二維dp陣列儲存結果時,需要用到dp[i-1][j-1] (左上方),dp[i-1][j] (上邊),dp[i][j-1] (左邊)。

3.優化為滾動陣列儲存結果時,由於在從左到右計算dp[j] (dp[i][j]) 的時候dp[j-1] (dp[i-1][j-1]) 已被更新為dp[j-1](dp[i][j-1]),所以只需要提前定義乙個變數last去儲存二維dp陣列左上方的值dp[i-1][j-1],即未被更新前的dp[j-1];

注意:計算每一行的第乙個元素時候,last需要初始化為0。

這裡是引用

最長公共子串 最長公共子串 動態規劃

有兩個字串 可能包含空格 請找出其中最長的公共連續子串,輸出其長度。長度在1000以內 例如 輸入 abcde bcd 輸出 3 1 把兩個字串分別以行和列組成乙個二維矩陣。2 比較二維矩陣中每個點對應行列字元中否相等,相等的話值設定為1,否則設定為0。3 通過查詢出值為1的最長對角線就能找到最長公...

最長公共子串(動態規劃)

描述 計算兩個字串的最大公共子串 longest common substring 的長度,字元不區分大小寫。輸入 輸入兩個字串 輸出 輸出乙個整數 樣例輸入 asdfas werasdfaswer樣例輸出 6 參考 這裡的最大公共字串要求的字串是連續的。求字串的方法和求子序列方法類似 當s i t...

最長公共子串 動態規劃

題目 給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為1000。示例 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。思想 動態規劃 步驟 第一步 確定子問題。在這一步重點是分析那些變數是隨著問題規模的變小而變小的,那些變數與問題的規模無關。第二步 確定狀態...