字符串全排列的输出(递归解法)
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
示例1
输入
"ab"
返回值
["ab","ba"]
题目如上,其实这是一道水题,但是好像做题的时候思路不对上就容易走火入魔,原本打算用dp做出来。。奈何不太熟不知道从何dp,于是看了下官方题解,把这个思路记录下来。
在原始字符串上进行操作的话,就不用担心漏了字符和字符重复什么的问题,用set暂存结果可以过滤多余的字符串结果。
思路大致这样,对目标string每两个字符进行一次换位,中间递归其他字符的交换,同时在得到一次结果之后回溯,因为换位之后其他分支的结果需要原来的字符串嘛,这样才能保证
结果比较全面,接下来是附带注解的代码。
class Solution { public: vector<string> Permutation(string str) {//递归解法 if(str.empty())return {};//字符串为空直接返回空结果 set<string> st;//字典可以过滤多余结果 change(0,str,st); return vector<string>({st.begin(),st.end()});//类型转换 } void change(int position,string s,set<string> &st){ for(int i=position;i<s.length();i++){//这里i=position 是防止漏了原始字符串的结果 swap(s[position],s[i]); change(position+1,s,st);//递归其他部分的字符串 st.insert(s);//结果记录 swap(s[position], s[i]);//回溯 } } };
又水了一份题解。

浙公网安备 33010602011771号