解析看代码注释:
#include<iostream>
#include<algorithm>
#include<vector>
#include<unordered_set>
#include<string>
using namespace std;
bool permutation(vector<string>&vec,int index,string &temp,unordered_set<string>m)
{
if(index==vec.size())
{
if(m.find(temp)==m.end()) return true;
return false;
}
for(int i=index;i<vec.size();i++)
{
for(int j=0;j<vec[i].size();j++)
{
temp.push_back(vec[i][j]);
if(permutation(vec,i+1,temp,m))
return true;
temp.pop_back();
}
}
return false;
}
string solution(vector<string>&vecstr)
{
vector<string>vec;
string temp;
unordered_set<string>m(vecstr.begin(),vecstr.end()); //把输入的相同的字符串去掉
for(int i=0;i<vecstr[0].size();i++)
{
string s = "";
unordered_set<char>a; //存列号相同的去重后的字符串
for(int j=0;j<vecstr.size();j++)
{
if(a.find(vecstr[j][i])!=a.end()) continue; //如果已经存在
s+= vecstr[j][i];
a.insert(vecstr[j][i]);
}
sort(s.begin(),s.end()); //对这个组合的字符串去重,这样方便找字典最小的字符串
vec.push_back(s);
}
//for(int i=0;i<vec.size();i++) cout<<vec[i]<<endl;
permutation(vec,0,temp,m); //回溯找字典序最小值
return temp==""?"-":temp;
}
int main()
{
vector<string>vecstr;
int N,L;
while(~scanf("%d%d",&N,&L))
{
string str;
for(int i=0;i<N;i++)
{
cin>>str;
vecstr.push_back(str);
}
string res = solution(vecstr);
cout<<res<<endl;
}
return 0;
}
/*
输入N L
3 4
CAKE
TORN
SHOW
3 4
aecd
cbef
dbcc
*/