描述:
計算兩個字串的最大公共子串(longest common substring)的長度,字元區分大小寫。
輸入:
輸入兩個字串
輸出:
輸出乙個整數
樣例輸入:
asdfas werasdfaswer
樣例輸出:
6
與最長公共子串行(參見《動態規劃dp》)一樣,最長公共子串也可以使用動態規劃解決,只不過思路不太一樣。準確地說,是打表的方式不一樣。
舉個例子:s1 =bab
,s2 =caba
。表如下
具體打表的方法是:
這樣的話,表中的最大元素就是 最長公共子串 的長度。並且也可以很容易看出最長公共子串有 2 個,分別是ba
和ab
。
c++**如下:
#include
#include
#include
#include
using
namespace
std;
int getlcstringlength(string s1, string s2)
else
// 不相等置0
table[i][j] = 0;
} }
return biggest;
}int main ()
如何輸出所有的最長公共子串?
很簡單,我們記錄下 s1 和 s2 的公共子串分別在 s1 、s2 中起始位置(即表中值為 1 的座標)。打表完成以後,我們已經知道了最長公共子串的長度length
,通過substr()
判斷即可:
s1.substr(i-1, length) == s2.substr(j-1, length)
c++**如下:
#include
#include
#include
using
namespace
std;
void printlcstring(string s1, string s2)
else
// 不相等置0
table[i][j] = 0;
} }
// 輸出所有的最長公共子串
vector
int, int> >::iterator beg = firstpos.begin();
for( ; beg!=firstpos.end(); ++beg)
}int main ()
個人站點: 華為oj oj2011最長公共子串的計算
最長公共子串的計算 輸入 asdfas werasdfaswer 輸出 6 動態規劃原理 1。將連個字串分別以行列組成乙個矩陣。2。若該矩陣的節點對應的字元相同,則該節點值為1。3。當前字元相同節點的值 左上角 d i 1,j 1 的值 1,這樣當前節點的值就是最大公用子串的長。s2 b c d e...
最長公共子串行 最長公共子串
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 當然我們現在一眼就可以看出來最長公...