您的位置:首页 > Web前端

【剑指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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: