Problem 0528 : Common Sub-String
共通部分文字列
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=0528
- 問題概要
二つの文字列における共通な部分文字列の長さを答えよ
- 解法
この問題での共通部分文字列の定義だと、
片方の文字列をいくつかずらしたときに、もう片方の文字列と一致する長さを求めればいい。
CDABC と CCCCCCCCCABC
だと、
二つめの文字列をずらした、CCABC と CDABC という文字列が
ABCという三つれんぞくで一致するので答えは3。
両方の文字列に対して、ずらすということをすればよい。
- ソース
#include<iostream> #include<string> #include<algorithm> #include<vector> #include<map> #include<set> #include<cstdlib> #include<cstdio> #include<cmath> #include<sstream> #include<cassert> #include<queue> #include<stack> #define REP(i,b,n) for(int i=b;i<n;i++) #define rep(i,n) REP(i,0,n) #define ALL(C) (C).begin(),(C).end() #define pb push_back #define mp make_pair #define vint vector<int> #define FOR(it,o) for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it) #define lli long long int #define ld long double using namespace std; main(){ string s1, s2; while(cin >> s1 >> s2){ int ans = 0; rep(i, s1.length()){ string tmp = s1.substr(i, s1.length() - i); int cnt = 0; rep(j, min(tmp.length(), s2.length())){ if(tmp[j] == s2[j])cnt++; else cnt = 0; ans = max(ans, cnt); } } rep(i, s2.length()){ string tmp = s2.substr(i, s2.length() - i); int cnt = 0; rep(j, min(tmp.length(), s1.length())){ if(tmp[j] == s1[j])cnt++; else cnt = 0; ans = max(ans, cnt); } } cout << ans << endl; } }