您的位置:首页 > 编程语言 > C语言/C++

字典序问题

2016-09-19 19:25 375 查看


我的思路很简单,程序开始前,先做一遍预处理,将处理的数据存到map中,处理时用到类似DP的思想进行优化。

#include<iostream>
#include<map>
#include<string>
#include<cstdlib>
using namespace std;

string book;
map<string,int> mymap[7];//前一个下标表示字符串长度
long long size=1;
map<string,int>::iterator itemap;

//len代表字符长度 rank代表此时生成的新字符串已有几个字符 big代表当前最大字符 s则是当前生成的新字符串内容
void dfs(int len, int rank,int big,string s)
{
if(len == rank) //当生成的新字符串长度等于字符串长度时,放入map
{
mymap[len][s] = size++;
return;
}
if(big == 26) //当最大字符已经是z时 返回
{
return;
}

for(int i=big+1; i<=26; i++)
{
dfs(len, rank+1, big+1, s+book[i]);
}
}

void init()
{
for(int i=1;i<=26;i++)
{
string ss="";
ss += 'a'+i-1;

book[i] = 'a'+i-1;
mymap[1][ss] = size++;
}

for(int i=1;i<6;i++)
{
map<string,int> mapp = mymap[i];
for(itemap=mapp.begin(); itemap!=mapp.end(); ++itemap)
{
string ss = itemap->first;
string st="";
st = ss[ss.size()-1];
//cout<<"最大字母:"<<st<<endl;
dfs(i+1,i,mymap[1][st],ss);
}
}

}

int main()
{
init();
int N;
string str;

//测试代码块 可无视
/*cout<<mymap[1]["a"]<<endl;
cout<<mymap[1]["z"]<<endl;
cout<<mymap[2]["ad"]<<endl;
cout<<mymap[6]["uvwxyz"]<<endl;*/

/*FILE *fp=fopen("file1.txt", "w+");
for(int i=1;i<=6;i++)
{
map<string,int> mapp = mymap[i];
for(itemap=mapp.begin(); itemap!=mapp.end(); ++itemap)
{
//cout<<itemap->first<<" "<<itemap->second<<endl;
fprintf(fp,"%s %d\n",(itemap->first).c_str(),itemap->second);
}
}*/

while(cin>>N)
{

for(int i=0;i<N;i++)
{
cin>>str;
cout<<mymap[str.size()][str]<<endl;
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  C++ 算法 排列组合 map