输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
解题思路:将字符串分为第一个字符和后面部分,然后递归或者dfs。
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
HashSet<String> set = new HashSet<String>();
ArrayList<String> res = new ArrayList<String>();
if(str == null || str.length() == 0) return res;
if(str.length() == 1){
res.add(str);
return res;
}
for(int i = 0; i < str.length(); i++){
String substring = str.substring(0, i) + str.substring(i+1, str.length());
ArrayList<String> tmp = Permutation(substring);
for(String j : tmp){
set.add(str.substring(i, i+1)+j);
}
}
for(String i : set){
res.add(i);
}
Collections.sort(res);
return res;
}
}
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Collections;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String> res = new ArrayList<String>();
if(str == null || str.length() == 0) return res;
char[] arr = str.toCharArray();
dfs(arr, 0, res);
Collections.sort(res);
return res;
}
public void dfs(char[] str, int index, ArrayList<String> res){
if(index == str.length - 1){
res.add(new String(str));
}
for(int i = index; i < str.length; i++){
if(i == index || str[i] != str[index]){
swap(str, i, index);
dfs(str, index+1, res);
swap(str, i, index);
}
}
}
public void swap(char[] str, int i, int j){
char ch = str[i];
str[i] = str[j];
str[j] = ch;
}
}
本文介绍了一种使用递归实现的字符串全排列算法,并提供了两种不同的Java实现方式。一种是通过不断取出并递归处理剩余子串来生成所有可能的排列组合;另一种则是采用深度优先搜索(DFS)的方式进行遍历,同时避免重复排列。最后对结果进行字典序排序。

被折叠的 条评论
为什么被折叠?



