面試題整理8 字串的排列

2021-06-20 18:01:54 字數 1154 閱讀 3236

《劍指offer》面試題28

題目: 輸入乙個字串,列印該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a、b、c所能排列出來的所有字串abc、acb、bac、bca、cab、cba。

分析:  當我看到這個題目,我首先想到字串中字元有可能重複,這時候該怎麼辦,如果沒有重複那就是將所有字元的排列列印出來,全排列也是不怎麼好求的,再往下就不好想了;

書中用了分治的思想,將大問題分解為小問題。此題中將乙個字串分解為兩部分,第一部分為它的第乙個字元,第二部分為後面的所有字元。

求乙個字串的全排列,可以分兩步:首先求出所有可能出現在第乙個位置的字元,在字串中可以採用把第乙個字元與後面的所有字元交換的方法,如abc字串中a分別於b、c交換,第乙個位置的字元可能是a、b、c;第二步固定第乙個字元,求後面字元的排列。如此遞迴,直到後面的字元為字串尾。

但是,書上的思路並沒有考略字串中字元重複的問題,如字串aaa,按照上述思路,排列有6種,但實際上每種都是aaa,所以應該是只有一種。

因此上述思路在我看來不是完全準確的,當把第乙個字元與後面的字元交換時,首先應該判斷兩者是否相同,如果相同則跳過,因為已經處理過此種情況。

但是這個思路同樣是有問題的,如aabb,還是會出現重複的情況。。對於解決重複沒有想到什麼好方法。。。

所以還是預設全排列就是所有字元不管是否相同的全排列。

**:在函式中pstr指向整個字串的第乙個字串,pbegin指向當前我們做排列操作的字串的第乙個字元。每一次遞迴從pbegin向後掃瞄每乙個字元,交換兩者後,再對pbegin後面的字串遞迴地做排列操作。

void permutation(char* pstr)

void permutation(char* pstr, char* pbegin)

else

/*if( *pch == *pbegin ) //去除和第乙個字元相同的

*/char temp = *pch;

*pch = *pbegin;

*pbegin = temp;

permutation(pstr, pbegin + 1);

temp = *pch;

*pch = *pbegin;

*pbegin = temp;}}

}

面試題28 字串排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。輸入描述 輸入乙個字串,長度不超過9 可能有字元重複 字元只包括大小寫字母。1 class solution 1...

面試題28 字串的排列

1.輸入乙個字串,列印出該字串中字元的所有排列,例如輸入字串abc,則列印出字元a,b,c的所有可能排列,abc,acb,bac,bca,cab,cba.分析 我們可以講字串看成兩部分組成,第一部分為第乙個字元,第二部分是後面所有的字元。首先求所有可能出現在第一位置的字元,即把第乙個字元和後面所有的...

面試題25 字串的排列

題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串abc,則列印由字元a,b,c所能排列出來的所有字串 abc,abc,bac,bca,cab,cba 我們求整個字串的排列,可以看成兩步 首先求出所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元交換。下圖就是分別把第乙個字元...