含重复字符的字符串组合算法(深度优先搜索树递归实现)

今天研究了字符串的组合,和字符串的全排列不同的是,组合只考虑元素的个数而不考虑元素的排列顺序。对于不含重复字符的字符串全排列,笔者搜索到的最简单的算法如下所示,来源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。也就是按照深度优先搜索其所有组合,其对应的搜索树如下图所示:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值