字符串的排列
来源:互联网 发布:java培训机构靠谱吗 编辑:程序博客网 时间:2024/06/10 01:44
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
//第一种class Solution {public: vector<string> Permutation(string str) { vector<string> answer; if(str.empty()) return answer; sort(str.begin(),str.end()); do{ answer.push_back(str); } while(next_permutation(str.begin(),str.end())); return answer; }};/*其中next_permutation的原理:http://leonard1853.iteye.com/blog/1450085百度搜索:全排列。应该可以理解下面的代码了。template<class BidirectionalIterator>bool next_permutation( BidirectionalIterator first, BidirectionalIterator last){ if(first == last) return false; //空序列 BidirectionalIterator i = first; ++i; if(i == last) return false; //一个元素,没有下一个序列了 i = last; --i; for(;;) { BidirectionalIterator ii = i; --i; if(*i < *ii) { BidirectionalIterator j = lase; while(!(*i < *--j)); iter_swap(i, j); reverse(ii, last); return true; } if(i == first) { reverse(first, last); //全逆向,即为最小字典序列,如cba变为abc return false; } }}*/
//第二种:用递归实现字典序法,好像还有一种字典序法不用递归来实现,不确定。class Solution { int u[10]={0}; vector<string> a;public: vector<string> Permutation(string str) { string tmp; if(str.size()==0) return a; Permu(str,tmp); sort(a.begin(),a.end()); a.erase(unique(a.begin(),a.end()),a.end()); return a; } void Permu(string str,string tmp){ if(str.size()==tmp.size()) return a.push_back(tmp); for(int i=0;i<str.size();++i){ if(u[i]==0){ u[i]=1; tmp+=str[i]; Permu(str,tmp); tmp=tmp.substr(0,tmp.size()-1); u[i]=0; } } } /* Permu函数也可以这么做,对if中的临时数据tmp1操作,而不是直接对tmp操作,可以不用执行删除末尾字符。 void Permu(string str,string tmp){ if(str.size()==tmp.size()) return a.push_back(tmp); for(int i=0;i<str.size();++i){ if(u[i]==0){ string tmp1=tmp; u[i]=1; tmp1+=str[i]; Permu(str,tmp1); u[i]=0; } } } */};
/*第三种方法:虽然是递归,但第二种字典序法有区别。链接:https://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7来源:牛客网*/public ArrayList<String> Permutation(String str) { ArrayList<String> res = new ArrayList<>(); if (str != null && str.length() > 0) { PermutationHelper(str.toCharArray(), 0, res); Collections.sort(res); } return res; } private static void PermutationHelper(char[] cs, int i, ArrayList<String> list) { if(i == cs.length - 1) { //解空间的一个叶节点 list.add(String.valueOf(cs)); //找到一个解 } else { for(int j = i; j < cs.length; ++j) { if(j == i || cs[j] != cs[i]) { SwapUtil.swap(cs, i, j); PermutationHelper(cs, i + 1, list); SwapUtil.swap(cs, i, j); //复位 } } } }
0 0
- 字符串的全排列
- 字符串的全排列
- 转载 字符串的排列
- 字符串的排列--总结
- 字符串的排列
- 字符串的全排列
- 字符串的排列
- 53.字符串的排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的全排列
- 字符串的排列
- 字符串的排列
- 字符串的排列
- 字符串的倒序排列
- 字符串的全排列
- 字符串的排列
- 【IMWeb训练营作业】小组作业 仿豆瓣app
- ant使用(一)生成jar包
- CSS之使用float及position属性实现页面轻松布局
- 封装精简版jQuery插件
- 在VM虚拟机中装centOS的网络配置
- 字符串的排列
- POJ
- 深度学习:卷积神经网络
- 【聚焦Oracle】ORACLE常用数值函数、转换函数、字符串函数
- 632.Binary Tree Maximum Node-二叉树的最大节点(入门题)
- java 中读写锁的使用
- windows下python安装Numpy和Scipy模块
- sqlserver 锁初探
- C语言技巧方式 一体机服务器群控