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;
    }

      

      

     

  • 相关阅读:
    MySQL 通过多个示例学习索引
    git reset的用法
    git rebase的用法
    学习yii2.0——依赖注入
    学习yii2.0——行为
    学习yii2.0——事件
    学习yii2.0——数据验证
    让Apache和Nginx支持php-fpm模块
    安装python3
    使用php操作memcache
  • 原文地址:https://www.cnblogs.com/DanielZheng/p/2146395.html
Copyright © 2011-2022 走看看