1. 程式人生 > >hdu 1238 Substrings(暴力+string類方法)

hdu 1238 Substrings(暴力+string類方法)

題意:求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;
}