求组合排列和字符串偏移

前段时间加班,让我好久没有看书了,周日又开始看programming pearls了,分享下我的代码。livewrier对代码排版的支持实在不好,大家凑合着看吧。

2.3节对字符串偏移的计算算法实在高明,真不知道作者是怎么想出来的,不过它的方法是可以用数学归纳法证明正确的,下面是我的实现代码:

#include
#include

void reverse(char *str, int startPos, int endPos)
{
    char temp;
    int i, j;

    for (i=startPos, j=endPos; i              temp = str[i]; 
             str[i] = str[j];
             str[j] = temp;
    }
}

void main()
{
      char sTest[] = "abcdefgh";
      int rotate = 3;
      int iLen = strlen(sTest);

      printf("%s/n", sTest);

      reverse(sTest, 0, rotate-1);
      reverse(sTest, rotate, iLen-1);
      reverse(sTest, 0, iLen-1);

      printf("%s/n", sTest);
}

是什么问题还是看原书2.3节吧。

对于2.4节的问题我还没有看答案,自己先给出了解答。代码如下,下周我再看看书中的解答。

#include
#include

void swap(char *str, int from, int to)
{
    char temp;

    temp = str[from];
    str[from] = str[to];
    str[to] = temp;
}

//permuations: 找出字符串的所有组合排列但不重复
//startPos: 前startPos个字符串都已经固定了
void permutations(char *str, int startPos, const int iLen)
{
    int i;

    //如果固定长度等于字符串长度则打印字符串
    if(iLen == startPos){
        printf("%s/n", str);
    }
    //否则继续固定一个字符串
    else{
        for (i=startPos; i             swap(str, startPos, i);
            permutations(str, startPos+1, iLen);
            swap(str, startPos, i);
        }
    }
}

void main()
{
    char sTest[] = "abcd";
    int iLen = strlen(sTest);

    permutations(sTest, 0, iLen);
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值