题意:给你N个字符串,问能否将他们重新排列,使得每个串都是后一个串的子串,能输出YES,输出这种排列,不能输出NO。
思路:因为如果有解,那么短的串一定是长的串的子串,所以按字符串长度排序,判断每个串是不是后一个串的子串即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 105;
int n;
string str[MAXN];
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++) cin >> str[i];
sort(str, str+n, [](string a, string b){ return a.size() < b.size(); });
bool flag = true;
for (int i = 0; i < n-1; i++)
{
if (str[i+1].find(str[i]) == string::npos)
{
flag = false;
break;
}
}
if (flag)
{
printf("YES\n");
for (int i = 0; i < n; i++) cout << str[i] << endl;
}
else printf("NO\n");
return 0;
}