ACM中常见的有两种问题:
1.按字典顺序输出全排列
如: abc 可产生
abc
acb
bac
bca
cab
cba
2.m字母选n个字母,按字典顺序输出
如: abc 中3选2
ab
ac
bc
ba
ca
cb
测试1:
首先说全排列的产生方式,中学的思想就是n!(n的阶乘),那么我们就可以用递归的方式来实现.
1.排序
2.枚举
模拟dance_link的思想,使其达到N!
枚举过程中,要解决字串中有重复字符问题
测试2:
m字母选n个字母,按字典顺序输出,问题就容易解决了,程序跟上边一样,
只是 dfs(inc,len,str) 中的len = n就可以了;
与网上一段流行程序作个比较:
测试3:
STL的写法:
测试环境: CPU AMD X2 4200+ 2.2G
测试字串:abcdefghijk
测试1 (我优化的程序)测试时间: 4.531s
测试2 流行程序测试时间: 7.859s
测试3 STL 程序测试时间: 9.375s
4.531/7.859 = 0.57....
4.531/9.375 = 0.48....
提高将近40%~50多的速度