今天研究了字符串的组合,和字符串的全排列不同的是,组合只考虑元素的个数而不考虑元素的排列顺序。对于不含重复字符的字符串全排列,笔者搜索到的最简单的算法如下所示,来源http://hi.baidu.com/%C2%AC%B1%C8%D0%A1%BE%AB%C1%E9/blog/item/21363d8912977fc09023d97d.html
void substr(char *str)
{
int i, j,n=strlen(str), m=1<<n, k;
for(i=1; i<m;i++)
{
for(j=0,k=i; k>0; k>>=1, j++)
if(k&0x01) putchar(str[j]);
putchar('n');//此处应为'\n',原代码可能有错误
}
}
即在串中没有相同字符时, 一个最简单的思路,设串长为n,把它和一个n位的二进制数关联起来,这个数从1跑到2^n时就跑遍了所有的字符的组合。
但是对于含重复字符时,上述方法是行不通的。笔者经过思考,对于含重复字符的字符串,可以这样遍历它的所有组合,例如acc这个字符串,这样求其组合,a,ac,acc,c,cc。也就是按照深度优先搜索其所有组合,其对应的搜索树如下图所示: