解法:string
题目大意:对给定多个字符串进行重排列,使得每个字符串前面的字符串都是自己的字串。如果无法得到,则输出NO。
思路:由题可得,每个字符串前的字符串长度必须小于或者等于当前字符串,因此可先按照字符串长度进行排序。对于排序后的字符串,只需判断前一个字符串是否是当前字符串的子串即可。判断需要用到find()函数。代码如下
#include<bits/stdc++.h>
const int MAXN = 105;
using namespace std;
bool compare(string a, string b)
{
return a.length() < b.length();
}
string s[MAXN];
int main()
{
bool flag = true;
int n;
cin>>n;
for(int i = 0 ; i < n; i++){
cin>>s[i];
}
sort(s,s+n,compare);
for(int i = 1; i < n; i++){
if(s[i].find(s[i-1]) == string::npos){
cout<<"NO"<<'\n';
flag = false;
break;
}
}
if(flag){
cout<<"YES"<<"\n";
for(int i = 0; i < n; i++){
cout<<s[i]<<'\n';
}
}
}