zoukankan      html  css  js  c++  java
  • 面试题:字符数组的全排列

    参考链接:http://blog.csdn.net/morewindows/article/details/7370155

    void _swap (char * a, char *b)
    {
             char k = *a;
            * a = *b ;
            * b = k ;
    }
    
    int str_all_sort (char * str,int pos, int size )
    {       
            
             printf("%d" ,pos);
             if(pos == size)
            {
                     printf("-" );
                     printf("%s " ,str);
            }
             else
            {
                     printf(" " );
                     for(int i= pos; i <=size; i++)
                    {
                             //交换位置
                             _swap(&str [i],& str[pos ]);
                             str_all_sort(str ,pos+1, size);
                             //再交换回来
                             _swap(&str [i],& str[pos ]);
                    }
            }
             return 0;
    }

    无重复全排列:

    122,第一个数1与第二个数2交换得到212,然后考虑第一个数1与第三个数2交换,此时由于第三个数等于第二个数,所以第一个数不再与第三个数交换。再考虑212,它的第二个数与第三个数交换可以得到解决221。此时全排列生成完毕。
    这样我们也得到了在全排列中去掉重复的规则——去重的全排列就是从第一个数字起每个数分别与它后面非重复出现的数字交换。用编程的话描述就是i与j交换时,要求[i,j)中没有与a[j]相等的数。下面给出完整代码:
     
    bool is_swap ( charstr int beginint target )
    {
             for (int i= begin ;i < target; i ++)
                     if (str [ i] == str [target ])
                             return false ;
             return true ;
    }
  • 相关阅读:
    Oracle存储过程
    Oracle触发器
    Oracle伪列
    Oracle索引
    Oracle视图
    Oracle数据库链路
    异常处理之动手动脑
    四则运算自动出题之javaweb版
    继承与多态之动手动脑
    javaweb之添加学生信息
  • 原文地址:https://www.cnblogs.com/guyan/p/2661651.html
Copyright © 2011-2022 走看看