ACM入门教程6-分治策略.ppt

* * 如何生成串? ‘A’ ‘B’ ‘C’ … ‘Y’ ‘Z’ 2 1 1 …. 1 0 我们可以得到每个字母的个数……. 如何拼出不同的等长串(串长为n)? ? ? ? ? ? …… * * ‘A’ ‘B’ ‘C’ … ‘Y’ ‘Z’ 2 0 (1-1) 1 0 1 0 ‘Y’ ‘B’ ‘A’ ‘B’ ‘C’ … ‘Y’ ‘Z’ 1(2-1) 1 0 … 1 0 ‘A’ ? ‘A’ ‘B’ ‘C’ … ‘Y’ ‘Z’ 2 1 1 0 0 (1-1) 0 ……. * * 长度为n串的排列问题,降解为: m(可供排列字符的种类)个(n-1)串的排列问题 如果n=0: 则排列完成。 * * 另一例子 Description: 编写一个程序,从已给的字符集合中生成所有可能的字符串。例如:已知一个字符串“abc”,你编写的程序必须输出:“abc”,“acb”,“bac”,“bca”,“cab”和“cba”。在输入的字符串中,有些字符可能出现多次,你的程序所产生的相同的字符串只能出现一次,并按字典顺序排列。 * * Input: 输入只包含一组数据。第一行包含一个正整数N(1=N=10),表示有N个字符串。接下来N行,每行都有一个字符串。字符串由小写和大写字母组成,应区分大小写。字符串的长度小于10。 Output: 对应每组输入字符串,输出应该包含由该字符串生成的所有不同的字符串。由同一个字符串生成的字符串必须按字典顺序排列输出。大写字母在相应的小写字母之前。 * * 参考: 主要数据存放: int count1[52]; //存放各个字母的个数; int count2[52]; //使用的各个字母个数; int index[52]; //按顺序存放包含字母的序号; A为0,a为1; int cMax; //字符个数 int len; // 串长度 比如,输入 AaaABbcXyz cMax: 8 len: 10 * * 比如,输入 AaaABbcXyz i 0 1 2 3 … 46 47 48 49 50 51 count1[i] 2 2 1 1 … 1 0 0 1 0 1 ‘A’ ‘a’ ‘B’ ‘b’ ‘C’ ‘X’ ‘y’ ‘z’ ‘A’ ‘a’ ‘B’ ‘b’ ‘X’ ‘x’ ‘Y’ ‘y’ ‘Z’ ‘z’ index[i] 0 1 2 3 5 46 49 51 * * int main(){ int cases,i; cincases; while(cases--){ string s; cins; memset(count1,0,sizeof(count1)); memset(count2,0,sizeof(count2)); int k=0; len=s.size(); for(i=0;ilen;i++){ if(s[i]=As[i]=Z) k=2*(int)(s[i]- A); if(s[i]=as[i]=z) k=2*(int)(s[i]- a)+1; count1[k]++; } …… * * …… int ci =0; cMax = 0; for(i=0;i 52;i++) if(count1[i] 0){ index[ci++]=i; cMax++; } findStr(0, ); } return 0; } * * void findStr(int num,string ts){ if(num==len){ couttsendl; return; } for(int i=0;i cMax;i++){ //枚举当前位置可选的字母 if(count2[index[i]] count1[index[i]]){ count2[index[i]]++;

文档评论(0)

1亿VIP精品文档

相关文档