hdu 1238 Substrings(暴力+string類方法)
阿新 • • 發佈:2018-11-02
題意:求n個字串的最長公共子串的長度,注意,公共子串翻轉後也算同一公共子串
題解:字串長度<=100,n<=100,t<=10,可以用暴力列舉,一開始我用map去記錄每一個字串的所有子串,最後比較一下最大值
發現超時了,後來才知道,可以以最小長度的那個字串來列舉所有字串
詳見程式碼:
#include<cstdio> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include <vector> #include<queue> #include <stack> #include <map> #define maxn 1005 #define INF 0x3f3f3f3f #define LL long long using namespace std; int n; string s[105]; int main() { ios::sync_with_stdio(false); int t; cin>>t; int mini,minz,maxi; while(t--) { cin>>n; minz=200; for(int i=0;i<n;i++) { cin>>s[i]; if(minz>s[i].size()) { minz=s[i].size(); mini=i; } } maxi=0; for(int i=0;i<s[mini].size();i++)//以最小長度字串來列舉所有字串 { for(int j=1;j<=s[mini].size()-i;j++)//其中,最小長度字串中的子串長度從1遞增 { string s1=s[mini].substr(i,j); string s2=s1; reverse(s2.begin(),s2.end()); int flag=0; for(int u=0;u<n;u++) {//如果所有字串中都沒有出現這個子串,則跳出去列舉下一個子串 if(s[u].find(s1,0)==string::npos&&s[u].find(s2,0)==string::npos) {//表示從s[u]中的0位置開始去查詢s1,看是否查詢成功 flag=1; break; } } if(flag==0&&j>maxi)//更新最大值 { maxi=j; } } } cout << maxi << endl; } return 0; }