成語接龍(字串,思路,按長度排序)
成語接龍
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 0 Accepted Submission(s): 0
Problem Description
小Z和大Z最近沉迷於成語接龍遊戲,他們準備把成語接龍的規則修改一下。規則是這樣的:有兩個字串,如果第一個字串是第二個字串的子串(也就是第一個字串在第二個字串中可以找到),那麼第一個字串後面可以接第二個字串。問題來了,現在有n個字串,你可以把n個字串的順序進行重組,使得這n個字串可以成語接龍,即第一個字串後面可以接第二個字串,第二個字串後面可以接第三個字串,......,第n-1個字串後面可以跟第n個字串。問你能不能把n個字串順序重組,滿足這n個字串可以成語接龍。
Input
第一行為一個整數T,代表有T組樣例。(T<=10)
每組資料中:
第一行為一個整數N,表示有N個字串。(N<=100)
接下來n行,每行一個字串,每個字串長度小於等於100。
Output
對於每組測試樣例,如果這n個字串順序重排之後可以成語接龍,輸出“Yes”,否則輸出“No”。每個測試樣例佔一行。
Sample Input
3
5
Abcabc
Abc
Abca
Abc
A
2
ABAC
ACB
2
ACDB
ACB
Sample Output
Yes No No
Hint
第一組樣例的成語接龍順序可以為:A、Abc、Abc、Abca、Abcabc。
思路:
如果這些字串可以成語接龍,那麼接龍後的字串滿足: 前面的字串的必定是後面字串的子串,且前面字串的長度小於等於後面的字串
如果字串長度相同的話,那麼這兩個字串必須一樣。
So,怎麼做,
把字串按長度從小到大排個序,遍歷每個字串,每個字串只要滿足這個字串是後面字串的子串即可(除最後一個)
程式碼:
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<algorithm>
#include<set>
using namespace std;
const int maxn=110;
string strArr[maxn];
int Solve(int index,int n)//判斷下標為index是否為陣列中其中一個字串
{
for(int i=0;i<n;++i)
{
if(i==index)
continue;
if(~strArr[i].find(strArr[index]))
return 1;
}
return 0;
}
bool cmp(string a,string b)
{
return a.length()<b.length();
}
int main()
{
int t;
int n,flag;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0;i<n;++i)
{
cin>>strArr[i];
}
sort(strArr,strArr+n,cmp);
flag=1;
for(int i=0;i<n-1;++i)//這個字串必須後面字串的字串
{
if(~strArr[i+1].find(strArr[i]))//不等於-1
continue;
flag=0;
}
if(flag)
printf("Yes\n");
else
printf("No\n");
}
}
如果還不太清楚的話
假設成語接龍後的字串已經排列完成,前面字串必定是後面字串的子串。
*所有可以滿足成語接龍的字串都滿足這樣的情況0
*不滿足就肯定不能進行成語接龍!