【剑指offer】二十、字符串的排列
2015-09-12 16:25
302 查看
题目描述
输入一个字符串,按照字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。分析:全排列问题属于典型的递归问题,对于递归问题,我们首先要做的是找到递归函数的出口,即递归终止条件,找出f(n)和f(n-1)之间的关系,我们f(n)为将第n个字符插入到n-1个字符的任何一个排列的任意一个位置上。求出所有权排列后再对其进行字典排序。
代码如下所示:
import java.util.ArrayList; public class Solution { public ArrayList<String> Permutation(String str) { return findPermutationStr(str); } private static ArrayList<String> findPermutationStr(Stringstr) { ArrayList<String> strList= findPermutations(str); ArrayList<String> strList2 = new ArrayList<String>(); for (int i = 0; i < strList.size(); i++) { if (!strList2.contains(strList.get(i))) { strList2.add(strList.get(i)); } } String tmpString = null; // [aabc, abac, abca, aacb, acab, acba, baac, baca, bcaa, caab, caba, // cbaa] for (int i = 0; i < strList2.size(); i++) { for (int j = 0; j < strList2.size() - 1 - i; j++) { if (compareStr(strList2.get(j), strList2.get(j+1)) >0) { tmpString = strList2.get(j); strList2.set(j, strList2.get(j + 1)); strList2.set(j + 1, tmpString); } } } return strList2; } private static ArrayList<String> findPermutations(String str) { ArrayList<String> strList = new ArrayList<String>(); if (str.length() == 0) { return strList; } if (str.length() == 1) { strList.add(str); return strList; } if (str.length() == 2) { char[] chArry = str.toCharArray(); strList.add(str); if (chArry[0] != chArry[1]) { String s = new String(new char[] { chArry[1], chArry[0] }); strList.add(s); } return strList; } ArrayList<String> subStrPermutation敏感词indPermutations(str.substring(1)); char firstChar = str.charAt(0); for (String s : subStrPermutations) { String tmpStr = firstChar + s; strList.add(tmpStr); char[] charArry = tmpStr.toCharArray(); for (int i = 0; i < tmpStr.length() - 1; i++) { char t = charArry[i]; charArry[i] = charArry[i + 1]; charArry[i + 1] = t; strList.add(new String(charArry)); } } return strList; } static int compareStr(String str1, String str2) { if (str1.length() != str2.length()) { return str1.length() > str2.length() ? 1 : -1; } for (int i = 0; i < str1.length(); i++) { if (str1.charAt(i) == str2.charAt(i)) { continue; } return str1.charAt(i) > str2.charAt(i)?1:-1; } return 0; } }
相关文章推荐
- 【转】获取/设置IFRAME内对象元素的几种JS方法
- POI生成Excel常见的几种样式的设置
- html5 图片预览
- javascript高级程序设计---document节点
- 利用jquery each方法遍历<span>内容
- javaScript学习(一)
- 【剑指offer】十九,数组中出现次数超过一半的数字
- 剑指offer:把数组排成最小的数
- jsp 行动标签
- 剑指offer:连续子数组的最大和
- 前端性能优化的14个规则
- JS数据类型之Function类型
- 剑指offer:数组中出现次数超过一半的数字
- jquery validation验证身份证号、护照、电话号码、email
- 详解JS的getByclass方法
- Bootstrap响应式折叠导航
- 《剑指offer》数字在排序数组中出现的次数
- jQuery二级联动动态列表
- Json的知识点全解析,解析json数据的好工具大全
- jsp页面是放在webroot目录下和web-inf下优缺点