拼多多笔试题 找字典序最小的不同的字符串

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014303647/article/details/82258304

这里写图片描述

解析看代码注释:

#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
*/

猜你喜欢

转载自blog.csdn.net/u014303647/article/details/82258304