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

2022-09-11 20:54:16 字數 1673 閱讀 9948

我們首先需要搞清楚以下兩個概念:最長公共子串行 vs 最長公共子串:

找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。

問題描述:

給定兩個字串,求解這兩個字串的最長公共子串行(longest common sequence)。比如字串1:bdcaba;字串2:abcbdab,則這兩個字串的最長公共子串行長度為4,最長公共子串行是:bcba

動態規劃解法分析:

a=(a1,a2,…an)b=是兩個序列,將 a 和 b的最長公共子串行記為lcs(a,b)

找出lcs(a,b)就是乙個最優化問題。因為,我們需要找到a 和 b中最長的那個公共子串行。而要找a 和 b的lcs,首先考慮a的最後乙個元素和b的最後乙個元素。

如果 an=bm,即x的最後乙個元素與y的最後乙個元素相同,這說明該元素一定位於公共子串行中。因此,現在只需要找:lcs(an-1,bm-1)

如果an != bm,產生了兩個子問題:lcs(an-1,bm) 和 lcs(an,bm-1),因為序列a 和 序列b 的最後乙個元素不相等,那說明最後乙個元素不可能是最長公共子串行中的元素。求解上面兩個子問題,得到的公共子串行誰最長,那誰就是 lcs(a,b)。用數學表示就是:lcs=max

我們要求c[i] [j],先判斷str1的第i個元素str2的第j個元素是否相同即判斷str[i - 1]str[j -1]是否相同,如果相同它就是c[i - 1] [j- 1] +1,相當於在兩個字串都去掉乙個字元時的最長公共子串再加1;否則最長公共子串取c[i] [j-1]或c[i-1] [j]

public class lcsequence 

return c[str1.length()][str2.length()];

}//test

public static void main(string args)

}

我們要求c[i] [j],先判斷str1的第i個元素str2的第j個元素是否相同即判斷str[i - 1]str[j -1]是否相同,如果相同它就是c[i - 1] [j- 1] +1,相當於在兩個字串都去掉乙個字元時的最長公共子串再加1;否則最長公共子串取0。

public class longestsubstring 

else c[i][j] = 0;

}return res;

}//test

public static void main(string args)

}

動態規劃解決最長公共子串行和最長公共子串

找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而找兩個字串的最長公共子串行,只要求子串行的字元都在原字串中出現且保持相對順序不對 動態規劃 1.最長公共子串,s1 a1a 2a3.am s2 b 1b2b 3.b n 狀態轉移方程 記f i,j 是以a i 和 b j 結尾的字 符串的最...

C 動態規劃 最長公共子串行和最長公共子串

寫在前面 本文矩陣思路 於這篇博文,感謝,侵刪 flag矩陣思路 於這篇博文,感謝,侵刪 include include include include using namespace std const int maxn 100 char str1 maxn char str2 maxn void...

動態規劃之最長公共子串行和最長公共子串

最長公共子串行,指兩個字串,子串行中最長的字串。不一定是連續字元 最長公共子串行長度 intlcs length const string str1,const string str2,vectorint veca for j 0 j str2.length j for i 1 i str1.len...