最長公共子串行 與 最長公共子串

2021-08-02 22:42:30 字數 1998 閱讀 7113

最長公共子串行:常用於解決字串的相似度,是指在母串中都出現過並且出現順序與母串保持一致的子串,不要求連續性。

最長公共子串:是指在母串中連續出現的子串。

例如:

cnblogs

belong

最長公共子串行為blog,最長公共子串為lo假設z

=,z2,

⋯,zk

>

是母串

x 與

y的最長公共子串行lcs,那麼

用二維陣列dp

[i][

j]記錄串x1

,x2,

⋯,xi

與y1,

y2,⋯

,yj 的lcs長度,則可得到狀態轉移方程: dp

[i][

j]=⎧

⎩⎨⎪⎪

0,dp

[i−1

][j−

1]+1

max(

dp[i

][j−

1],d

p[i−

1][j

])if i=0

||j=

0if i,

j>0&&

xi=y

jif i,

j>

0andxi

≠̸yj

**實現

//最長公共子串行

int longestcommonsubsequence(string a, string b)

return dp[alen][blen];

}

最長公共子串是最長公共子串行的一種特殊情況,考慮到最長公共子串的連續性,定義狀態轉移方程如下: dp

[i][

j]=⎧

⎩⎨⎪⎪

0,dp

[i−1

][j−

1]+1

0if i=

0||j

=0if i,j

>0&&

xi=y

jif i,

j>

0andxi

≠̸yj

最長公共子串的長度為 ma

x(c[

i,j]

),i∈

(1,⋯

,m),

j∈(1

,⋯,n

) 。

**實現

//最長公共子串

int longestcommonsubstring(string a, string b)

else

dp[i][j] = 0;

}return result;

}

解題思路:

如果能在母串s中找到最長的子串行l,並且這個子串行是回文,那麼插入ans = strlen(s) - strlen(l)個字元就能使得原串成為回文字串。

問題轉為求乙個字串的最長回文子串行,這個問題可以使用最長公共子串行的解法,解法如下:

1.求s的逆序串 s』,;

2.求s和s』的最長公共子串行l,l即為s的最長回文子串行;

3.ans = strlen(s) - strlen(l)。

例如: s = abca 那麼 s』 = acba ,那麼l = aba 那麼答案就是1。即 a『c』bca。其中』c』為插入的字元。

**實現

//新增最少字元使得字串整體為回文字串

int getpalindrome(string str);

}//得到母串與其逆序字串的最長公共子串行長度

int lcslen = longestcommonsubsequence(str, invertedstr);

return

len - lcslen;

}

最長公共子串與最長公共子串行

一 最長公共子串 longest common substring 遍歷的時候用乙個二維陣列儲存相應位置的資訊,如果兩個子串1與子串2相應位置相等 則看各自前乙個位置是否相等,相等則該位置值b i j b i 1 j 1 1,不相等則置為1。如果兩個子串1與子串2相應位置不相等,則b i j 0。如...

最長公共子串行 最長公共子串

1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...

最長公共子串行 最長公共子串

1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...