劍指offer系列之26 字串的排列

2021-07-11 03:46:17 字數 970 閱讀 9472

題目描述:輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。

輸入描述:輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。

思路:先不考慮是否出現重讀字元,要對乙個字元進行全排列,可以把第乙個字元和後面的字元看成兩部分,而第乙個字元後面的字元又可看成第乙個字元與後面兩部分,這顯然是乙個遞迴的過程,只要第乙個字元的位置沒有到達字串的末尾就分別將第乙個字元與後面的字元進行交換。這裡有一點需要注意:那就是比如第乙個字元與後面的某個位置的字元發生交換後,需要再次發生交換,不然順序就會被打亂。舉個例子,在字串abc中,在把第乙個字元看成是a,後面的字元b、c看成乙個整體的時候,abc這個相對順序不能改變,所以當b與c發生交換變成了acb之後,需要再次交換兩個字元,重新回到abc。

public arraylistpermutation(string str) 

private arraylistpermutation(arraylistlist, char str,

int begin, int length)

} else }}

return list;

}private

void swap(char str, int begin, int i)

下面是一種非遞迴的實現:

public arraylist permutation2(string str) );

do ;

if (strs[0].length() == 0) else

}} while (!stack.isempty());

for (string s : tree)

results.add(s);

return results;

}

劍指offer系列20 字串的排列

求乙個字串中所有出現的字元的排列組合。首先把這個問題分解成若干個小問題 分治法。將所有的字元的排列可以拆分為第乙個字元的選取和其餘所有字元。然後其餘的字元又可以拆分為第乙個字元的變化選取和其餘的字串。以此類推即可得到解答。這就是很明顯的遞迴了。注意遞迴的結束條件以及什麼時候把這個字串壓入vector...

劍指offer系列 38 字串的排列

nowcoder 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串 abc,則列印出由字元 a,b,c 所能排列出來的所有字串 abc,acb,bac,bca,cab 和 cba。我們求整個字串的排列,可以看成兩步 首先求所有可能出現在第乙個位置的字元,即把第乙個字元和後面所有的字元...

劍指offer 二 字串 cpp

1.替換空格void replacespace char str,int length originallen int newlen originallen numofblank 2 if newlen length return while originallen 0 originallen ne...