码迷,mamicode.com
首页 > 其他好文 > 详细

【剑指offer】二十、字符串的排列

时间:2015-09-12 17:35:10      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

题目描述

输入一个字符串,按照字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
 
分析:全排列问题属于典型的递归问题,对于递归问题,我们首先要做的是找到递归函数的出口,即递归终止条件,找出f(n)和f(n-1)之间的关系,我们f(n)为将第n个字符插入到n-1个字符的任何一个排列的任意一个位置上。求出所有权排列后再对其进行字典排序。
代码如下所示:
 1 import java.util.ArrayList;
 2  public class Solution {
 3      public ArrayList<String> Permutation(String str) {
 4          return findPermutationStr(str);
 5          
 6      }
 7      private static ArrayList<String> findPermutationStr(Stringstr) {
 8          ArrayList<String> strList= findPermutations(str);
 9          ArrayList<String> strList2 = new ArrayList<String>();
10          for (int i = 0; i < strList.size(); i++) {
11              if (!strList2.contains(strList.get(i))) {
12                  strList2.add(strList.get(i));
13              }
14  
15          }
16          String tmpString = null;
17          // [aabc, abac, abca, aacb, acab, acba, baac, baca, bcaa, caab, caba,
18          // cbaa]
19          for (int i = 0; i < strList2.size(); i++) {
20              for (int j = 0; j < strList2.size() - 1 - i; j++) {
21                  if (compareStr(strList2.get(j), strList2.get(j+1)) >0) {
22                      tmpString = strList2.get(j);
23                      strList2.set(j, strList2.get(j + 1));
24                      strList2.set(j + 1, tmpString);
25                  }
26              }
27          }
28          return strList2;
29      }
30      private static ArrayList<String> findPermutations(String str) {
31          ArrayList<String> strList = new ArrayList<String>();
32          if (str.length() == 0) {
33              return strList;
34          }
35          if (str.length() == 1) {
36              strList.add(str);
37              return strList;
38          }
39          if (str.length() == 2) {
40              char[] chArry = str.toCharArray();
41              strList.add(str);
42              if (chArry[0] != chArry[1]) {
43                  String s = new String(new char[] { chArry[1], chArry[0] });
44                  strList.add(s);
45              }
46  
47              return strList;
48          }
49  
50          ArrayList<String> subStrPermutation敏感词indPermutations(str.substring(1));
51          char firstChar = str.charAt(0);
52          for (String s : subStrPermutations) {
53              String tmpStr = firstChar + s;
54              strList.add(tmpStr);
55              char[] charArry = tmpStr.toCharArray();
56              for (int i = 0; i < tmpStr.length() - 1; i++) {
57                  char t = charArry[i];
58                  charArry[i] = charArry[i + 1];
59                  charArry[i + 1] = t;
60                  strList.add(new String(charArry));
61              }
62          }
63          return strList;
64      }
65  
66       static int compareStr(String str1, String str2) {
67          if (str1.length() != str2.length()) {
68              return str1.length() > str2.length() ? 1 : -1;
69          }
70          for (int i = 0; i < str1.length(); i++) {
71              if (str1.charAt(i) == str2.charAt(i)) {
72                  continue;
73              }
74              return str1.charAt(i) > str2.charAt(i)?1:-1;
75  
76          }
77          return 0;
78      }
79  }

 

【剑指offer】二十、字符串的排列

标签:

原文地址:http://www.cnblogs.com/huntertoung/p/4803180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!