careercup-递归和动态规划 9.5
2014-12-07 23:30
169 查看
9.5 编写一个方法,确定某字符串的所有排列组合。
类似leetcode:Permutations
解法:
跟许多递归问题一样,简单构造法非常管用。假设有个字符串S,以字符序列a1a2a...an表示。
终止条件:n=1
S=a1,只有一种排列组合,即字符串a1
情况:n=2
S=a1a2 有两种排列组合a1a2和a2a1
情况:n
对于一般情况下,我们只需重复这个步骤。即已经求得f(n-1)的解,接着只要将an插入到这些字符串的任意位置。
c++代码实现:
类似leetcode:Permutations
解法:
跟许多递归问题一样,简单构造法非常管用。假设有个字符串S,以字符序列a1a2a...an表示。
终止条件:n=1
S=a1,只有一种排列组合,即字符串a1
情况:n=2
S=a1a2 有两种排列组合a1a2和a2a1
情况:n
对于一般情况下,我们只需重复这个步骤。即已经求得f(n-1)的解,接着只要将an插入到这些字符串的任意位置。
c++代码实现:
#include<iostream> #include<vector> #include<string> using namespace std; vector<string> getPerms(string str) { if(str.empty()) return vector<string>(); int n=str.length(); vector<string> res; res.push_back(string("")); vector<string> r; int i,j; for(i=0;i<n;i++) { char c=str[i]; r=res; res.clear(); for(j=0;j<r.size();j++) { string tmp=r[j]; int index=0; while(tmp.begin()+index!=tmp.end()) { tmp.insert(tmp.begin()+index,c); res.push_back(tmp); tmp=r[j]; index++; } tmp.push_back(c); res.push_back(tmp); } } return res; } int main() { string str="abc"; vector<string> res=getPerms(str); for(auto s:res) cout<<s<<endl; }
相关文章推荐
- careercup-递归和动态规划 9.10
- careercup-递归和动态规划 9.1
- careercup-递归和动态规划 9.2
- careercup-递归和动态规划 9.3
- careercup-递归和动态规划 9.6
- careercup-递归和动态规划 9.11
- CareerCup 递归与动态规划 Q9.10 最大高度堆箱子
- careercup-递归和动态规划 9.7
- careercup-递归和动态规划 9.8
- careercup-递归和动态规划 9.9
- 程序员面试金典: 9.9 递归和动态规划 9.5求字符串的全排列
- 剑-正则表达式匹配(递归 + 动态规划)
- 9.9递归和动态规划(十一)——算出有几种括号的放法可使该表达式得出result值
- 程序员面试金典: 9.9 递归和动态规划 9.1上楼的方式
- 动态规划——递归写法和递推写法
- 计算回文子序列(Java语言,动态规划,递归)
- 61-递归和动态规划-汉诺塔II(记录当前序列是最有序列中的第几步)
- 递归,递推,分治,贪心,动态规划......
- 斐波拉契数列=>多种方法的比较(分治、递归、动态规划/递推)
- 暴力递归转动态规划详解