题意:给你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;
}
本文介绍了一种通过排序和匹配来解决字符串是否可以按特定顺序排列的问题。算法首先按字符串长度进行排序,然后检查每个字符串是否为下一个字符串的子串。若所有字符串都能满足条件,则输出排列方式。
281

被折叠的 条评论
为什么被折叠?



