劍指 offer 字串的排列

2021-09-17 18:30:04 字數 1440 閱讀 7878

題目描述

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

輸入描述:

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

分析

這道題包括了重複字元的情況,會稍微複雜一點。先考慮無重複字元的情況。

如果會回溯演算法的話,那麼這道題會很簡單。或者說深度優先遍歷也可,因為其本質上也就是回溯演算法。visit 陣列表示第 i 個字元是否已經訪問過。每次遞迴,對字串中所有字元遍歷一次。當訪問至最後乙個字元時,將整個 string 加入 vector中。舉例來說,初始時,遍歷 a,b,c,首先是 a,然後對 a 進行 遞迴,再遍歷,a 已經訪問過,b 沒有,那麼 a + b(字元合併),再遞迴,下一輪得到 c,遞迴到終止條件,回退;得到 a + c,再遞迴,得到 a + c + b。。。(過**得很難說清楚,可參考深度優先遍歷演算法)。

對於重複字元的情況,我直接就暴力解法了,對已經生成的 vector排序, 然後刪除重複元素,後來看了別人的部落格,有更好的解法。如果有更好的辦法煩請告訴我,謝謝。

void permutation(vector&per, string str, string now, int* visit) 

for (int i = 0; i < str.size(); ++i) }}

vectorpermutation(string str)

// 使用佇列會更快

int* visit = new int[str.size()];

for(int i = 0; i < str.size(); ++i)

//vectorvisit;

permutation(per, str, "", visit);

sort(per.begin(), per.end());

for (int i = 1; i < per.size(); ++i)

} return per;

}

void permutation(vector&per, string str, int begin) 

for (int i = begin; i < str.size(); ++i)

}vectorpermutation2(string str)

permutation(per, str, 0);

sort(per.begin(), per.end());

// 去除重複值

for (int i = 1; i < per.size(); ++i)

} return per;

}

劍指Offer 字串排列

題目描述 輸入乙個字串,列印出該字串中字元的所有排列。解析 step 1 求所有可能出現第乙個位置的字元。把第乙個字元與後面的每個字元交換。step 2 固定第乙個字元,將後面的字元利用遞迴進行全排列。include include using namespace std void stringpe...

劍指offer 字串的排列

題目描述 輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c 所能排列出來的所有字串abc,acb,bac,bca,cab和cba。結果請按字母順序輸出。解題思路 深度搜尋,在每層搜尋裡設定乙個a陣列對映所有字元,每個字元在這層迴圈中只能使用一次,避免重...

劍指offer 字串的排列

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