zoukankan      html  css  js  c++  java
  • 字符串的全排列问题

    对于一个字符串abc, 求它的全排列可以这样分析:

    • 第一个字符为a时,bc的全排列
    • 第一个字符为b时,ac的全排列
    • 第一个字符为c时,ab的全排列
    对上述各种情况的子串采用相同的方法,直到子串只有一个字符为止,全排列就是它自身。
    各处代码:
    void swap(char * a, char * b)
    {
    char temp = *a;
    *a = *b;
    *b = temp;
    }
    void permutation(char *s, int start, int end)  //end = strlen(s)
    {
    int i;
    if (start == end) {
    printf(
    "%s\n", s);
    }
    else {
    for (i = start; i < end; i++) {
    swap(
    &s[start], &s[i]);
    permutation(s, start
    + 1, end);
     
    swap(&s[start], &s[i]); //start及其后面的每一个元素都要与start位置上的元素交换,所以要对上一次交换的结果复原
            }  
    }
    }

     以上代码执行过程:

      为什么要复原?对于abc,b,c又要与a交换,所以 abc->bac->(abc)->cba, 如果不复原则为abc->bac->cab, 不符合递归的规则。

      对上面的swap函数,我本来使用的如下形式:

    void swap(char * a, char * b)
    {
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
    }

      上面这个函数当a与b指向同一个地址时,a与b指向的值同时更新,永远相同,所以到的结果是*a = 0, *b = 0。

      解决办法:进入函数时判断a与b是否指向同一地址:

    void swap(char * a, char * b)
    {
    if(a == b)
    return;
    *a = *a + *b;
    *b = *a - *b;
    *a = *a - *b;
    }

      

      

     

  • 相关阅读:
    2016-7-4工作总结
    2016-7第一周工作总结
    2016-6-30 工作总结
    2016-6-29 工作总结
    2016-6-28 工作总结
    基于软件开发对嵌入式开发的思考
    团队项目总结
    软件工程课程总结
    图描述之:流程图
    004-二叉树的遍历
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2146395.html
Copyright © 2011-2022 走看看