字串的排列

2021-09-25 10:58:36 字數 1437 閱讀 2752

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

輸入乙個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。
思路:遞迴法,問題轉換為先固定第乙個字元,求剩餘字元的排列;求剩餘字元排列時跟原問題一樣。

(1)遍歷出所有可能出現在第乙個位置的字元(即:依次將第乙個字元同後面所有字元交換);

(2)固定第乙個字元,求後面字元的排列(即:在第1步的遍歷過程中,插入遞迴進行實現)。

需要注意的幾點:

(1) 先確定遞迴結束的條件,例如本題中可設begin == str.size() - 1; 

(2) 形如abaaa等特殊測試用例的情況,vector在進行push_back時是不考慮重複情況的,需要自行控制;

(3) 輸出的排列可能不是按字典順序排列的,可能導致無法完全通過測試用例,考慮輸出前排序,或者遞迴之後取消復位操作。

class solution 

void helper(vector&vec,int start,int end,string &str)

for(int cur = start;cur<=end;cur++)

}public:

vectorpermutation(string str)

};

參考:

2.使用dfs來解

class solution 

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

vectorvisited(n, false);

string res_str = "";

dfs_helper(res, str, res_str, visited);

return res;

}void dfs_helper(vector&res, string &str, string &res_str, vector&visited)

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

if(i != 0 && !visited[i - 1] && str[i] == str[i - 1])

visited[i] = true;

res_str.push_back(str[i]);

dfs_helper(res, str, res_str, visited);

res_str.pop_back();

visited[i] = false;}}

};

字串排列

在網上看到了乙個操作字串的題目,該題為 字串排列。大概意思是列出字串中所有字元的所有組合並且輸出無重複。自己做了一下,這裡分享該題的思路,和做法。自我覺得實現的有些麻煩 歡迎指點。問題輸入乙個字串,列印出該字串中字元的所有排列。輸入 字串abc。輸出 列印出由字元a,b,c所能排列出來的所有字串ab...

字串排列

輸入乙個字串,按字典序列印出該字串中字元的所有排列。例如輸入字串abc,則列印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。第一種方法 字串拼接 function permutate str else return result console.log pe...

字串的排列

題目 輸入乙個字串,列印出該字串中字元的所有排列。例如輸入字串 abc,則輸出由字元a b c所能排列出來的所有字串 abc acb bac bca cab和 cba。分析 這是一道很好的考查對遞迴理解的程式設計題,因此在過去一年中頻繁出現在各大公司的面試 筆試題中。我們以三個字元 abc為例來分析...