(劍指Offer)面試題28:字符串的排列


題目:

輸入一個字符串,打印出該字符串中字符的所有排列。

例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。 

思路:

把一個字符串看成兩部分組成:第一部分為第一個字符,第二部分為后面的所有字符。

求整個字符串的排列,可以看出兩步:首先求所有可能出現在第一個位置的字符,即把第一個字符和后面的所有字符交換;然后固定第一個字符,求后面所有字符的排序。此時仍把后面的字符看成兩部分,第一個字符和后面的字符,然后重復上述步驟。(遞歸)

在后面的在線測試中,要求輸入字符串可能有重復的字符,輸出按照字典順序。

類似題目:

 

 1、輸入一個含有8個數字的數組,判斷有么有可能把這8個數字分別放到正方體的8個頂點上,使得正方體上三組相對的面上的4個頂點的和相等。

 

 思路:相當於求出8個數字的全排列,判斷有沒有一個排列符合題目給定的條件,即三組對面上頂點的和相等。

2、N皇后問題:在8 X 8的國際象棋上擺放八個皇后,使其不能相互攻擊,即任意兩個皇后不得處於同一行,同一列或者同意對角線上,求出所有符合條件的擺法。

思路:由於8個皇后不能處在同一行,那么肯定每個皇后占據一行,這樣可以定義一個數組A[8],數組中第i個數字,即A[i]表示位於第i行的皇后的列號。先把數組A[8]分別用0-7初始化,接下來對該數組做全排列,由於我們用0-7這7個不同的數字初始化數組,因此任意兩個皇后肯定也不同列,那么我們只需要判斷每個排列對應的8個皇后中是否有任意兩個在同一對角線上即可,即對於數組的兩個下標i和j,如果i-j==A[i]-A[j]或i-j==A[j]-A[i],則認為有兩個元素位於了同一個對角線上,則該排列不符合條件。

 

代碼:

#include <iostream>
#include <stdio.h>
#include <vector>
#include <algorithm>

using namespace std;

void swap(char* c1,char* c2){
    char tmp=*c1;
    *c1=*c2;
    *c2=tmp;
}

void permutation(char* pstr,char* pbegin){
    if(*pbegin=='\0')
        printf("%s\n",pstr);
    else{
        for(char* pCh=pbegin;*pCh!='\0';pCh++){
            swap(pbegin,pCh);
            permutation(pstr,pbegin+1);
            swap(pbegin,pCh);
        }
    }
}

void permutationStr(char* pstr){
    if(pstr==NULL)
        return;
    permutation(pstr,pstr);
}


int main()
{
    char str[4]="abc";
    permutationStr(str);
    return 0;
}

在線測試OJ:

http://www.nowcoder.com/books/coding-interviews/fe6b651b66ae47d7acce78ffdd9a96c7?rp=2

輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串abc,則打印出由字符a,b,c所能排列出來的所有字符串abc,acb,bac,bca,cab和cba。
(輸入一個字符串,長度不超過9(可能有字符重復),字符只包括大小寫字母。)

AC代碼:

class Solution {
public:
    void swap(char* c1,char* c2){
        char tmp=*c1;
        *c1=*c2;
        *c2=tmp;
    }
    
    void Permutation(string &str,int begin,vector<string> &result){
        int len=str.length();
        if(begin==len-1)
            result.push_back(str);
        else{
            for(int i=begin;i<len;i++){
                if(i==begin || str[i]!=str[begin]){
                	swap(&str[begin],&str[i]);
                	Permutation(str,begin+1,result);
                	swap(&str[begin],&str[i]);   
                }
            }
        }
    }
    
    vector<string> Permutation(string str) {
        vector<string> result;
        if(str.length()>0){
            Permutation(str,0,result);
            sort(result.begin(),result.end());
        }
        return result;
    }
};


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM