• 面试题28:字符串全排列


    字符串全排列是面试中常考的问题,一定要掌握

    这题没写出来,思路就是把第一个字符和后面所有字符交换,然后递处理后面n-1个,最后需要在调用交换函数换回原始字符串

     1 #include<iostream>
     2 using namespace std;
     3 #include<assert.h>
     4 
     5 void Permutation(char* pStr, char* pBegin)
     6 {
     7     assert(pStr && pBegin);
     8 
     9     if(*pBegin == '')
    10         printf("%s
    ",pStr);
    11     else
    12     {
    13         for(char* pCh = pBegin; *pCh != ''; pCh++)
    14         {
    15             swap(*pBegin,*pCh);
    16             Permutation(pStr, pBegin+1);
    17             swap(*pBegin,*pCh);
    18         }
    19     }
    20 }
    21 
    22 int main(void)
    23 {
    24     char str[] = "abc";
    25     Permutation(str,str);
    26     return 0;
    27 }

    http://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7?tpId=13&tqId=11180&rp=2&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking

    牛客网上的输入可能有重复,需要做去重处理

    class Solution {
    public:
        vector<string> result;
        vector<string> Permutation(string str) { 
            if(str.empty())
                return result;
            Permutation(str,0);
            return result;
        }
        void Permutation(string str,int i)
        {
            if(i == str.length())
                result.push_back(str);
            else
            {
                for(int j = i;j < str.length();j++)
                {
                    sort(str.begin() + i,str.end());    //先对str按字典排序
                    if(i != j && str[i] == str[j])    //方式aa这种输出两次
                        continue;
                    swap(str[i],str[j]);
                       Permutation(str,i+1);
                    swap(str[i],str[j]);     
                }
            }
        }
    };

    更多字符串排列问题参考:http://blog.csdn.net/hackbuteer1/article/details/7462447

    总结全排列递归问题:

    if和递归调用控制一个总体循环,for控制剩余循环

    fun(数组,起始遍历位置)
    {
        if (终止条件)
            操作;
        else
        for (遍历数组)
        {
            swap();
            fun(); 递归调用
            swap();
        }
    }

    8皇后问题可参考全排列解法 

  • 相关阅读:
    jsonp的实现原理和缺点
    vue $set的使用初了解
    js将多维数组转换为一维数组
    微信小程序之页面打开数量限制
    ZOJ 1463 Brackets Sequence
    CSUOJ 1248 非变性聚丙烯酰胺凝胶电泳
    ZOJ 1524 Supermarket
    POJ 1012 Joseph
    ZOJ 1276 Optimal Array Multiplication Sequence
    POJ 1742 Coins
  • 原文地址:https://www.cnblogs.com/raichen/p/5653153.html
Copyright © 2020-2023  润新知