1. 程式人生 > >成語接龍(字串,思路,按長度排序)

成語接龍(字串,思路,按長度排序)

成語接龍

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

*不滿足就肯定不能進行成語接龍!