華為OJ2011 最長公共子串

2022-08-22 05:42:13 字數 1577 閱讀 2592

描述:

計算兩個字串的最大公共子串(longest common substring)的長度,字元區分大小寫。

輸入:

輸入兩個字串

輸出:

輸出乙個整數

樣例輸入:

asdfas werasdfaswer
樣例輸出:

6
與最長公共子串行(參見《動態規劃dp》)一樣,最長公共子串也可以使用動態規劃解決,只不過思路不太一樣。準確地說,是打表的方式不一樣。

舉個例子:s1 =bab,s2 =caba。表如下

具體打表的方法是:

這樣的話,表中的最大元素就是 最長公共子串 的長度。並且也可以很容易看出最長公共子串有 2 個,分別是baab

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 當然我們現在一眼就可以看出來最長公...