0528 Common Sub-String (共通部分文字列)
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0528
ある2つの文字列が与えられて,それの最長共通部分文字列の長さを答える問題.
空文字列は任意の文字列の共通部分文字列とし,空文字列の長さは 0 とする.
最初は最長共通部分文字列の長さに関して二分探索し,KMP 法でその長さの部分文字列が存在するかどうかチェックするコードを書いたけど TLE.
2つの文字列を s1, s2 とし,s2 の j 番目と s1 の j - i 番目から比較していくようなコードを書いたら通った.
#include <iostream> #include <vector> using namespace std; int solve(const string& s1, const string& s2) { int max_len = 0; for (int i = -int(s1.size()); i <= int(s2.size()); i++) { int len = 0; for (int j = max(i, 0); j < int(min(s1.size()+i, s2.size())); j++) { if (s1[j-i] == s2[j]) { len++; max_len = max(max_len, len); } else { len = 0; } } } return max_len; } int main() { string s1, s2; while (cin >> s1 >> s2) { cout << solve(s1, s2) << endl; } return 0; }