前排芝士:
思路:
将每个字符串按照某些条件排序,看前一个字符串是否是当前字符串的子串,如果不是则直接输出
判断的详细注释见代码
AC CODE:
#include<bits/stdc++.h>
using namespace std;
bool cmp(string s1,string s2){//自定义排序函数
if(s1.size()!=s2.size()){//当两个字符串长度不相等
return s1.size()<s2.size();//将长度小的排在前面
}else{//两个字符串长度相等
return s1<s2;//将 ASCII 小的字符串排在前面
}
}
int main(){
int n;
string a[105];
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+n+1,cmp);//排序
for(int i=2;i<=n;i++){//从 2 开始枚举
if(a[i].find(a[i-1])==-1){//在此字符串中找不到前一个字符串
cout<<"NO\n";//直接输出
return 0;//结束程序
}
}
cout<<"YES\n";//新排列中的每个字符串都满足在它前面的串都是它的子串
for(int i=1;i<=n;i++)cout<<a[i]<<endl;//输出每一个字符串
return 0;
}