题目:
题解:
代码:
1. 代码一:
通过List 的 contains() 方法,进行去重。
import java.util.*;
public class 全排列 {
public static ArrayList<String> Permutation(String str)
{
ArrayList<String> ans = new ArrayList<>(); //所有排列的可能都在这里
if(str != null || str.length() > 0)
{
int n = str.length();
char s[] = str.toCharArray();
Arrays.sort(s); // 输入字符串如果是乱序,则需要先按照从小到大的顺序排列
backtrack(s, 0, n - 1, ans);
Collections.sort(ans);
}
return ans;
}
public static void backtrack(char s[], int begin, int end, ArrayList<String> ans)
{
if(begin == end)
{
String str = String.valueOf(s);
if(!ans.contains(str))
{
ans.add(str);
}
}
for(int i = begin; i <= end; i++)
{
swap(s, i, begin); //依次选一个数固定住
backtrack(s, begin + 1, end, ans); //让后面的进行全排列
swap(s, i, begin); //恢复原来的模样,回溯关键
}
}
public static void swap(char s[], int i, int j)
{
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext())
{
String str = sc.next();
ArrayList<String> res = Permutation(str);
for(int i = 0; i < res.size(); i++)
{
System.out.println(res.get(i));
}
System.out.println();
}
}
}
2. 代码二:
使用Set集合来进行去重。
import java.util.*;
public class 面试题38 {
// public static ArrayList<String> Permutation(String str)
// {
// ArrayList<String> ans = new ArrayList<>(); //所有排列的可能都在这里
// if(str != null || str.length() > 0)
// {
// int n = str.length();
// char s[] = str.toCharArray();
// Arrays.sort(s); // 输入字符串如果是乱序,则需要先按照从小到大的顺序排列
// backtrack(s, 0, n - 1, ans);
// Collections.sort(ans);
// }
// return ans;
// }
public static String[] permutation(String s) {
Set<String> set = new TreeSet<>(); //所有排列的可能都在这里
if(s != null || s.length() > 0)
{
int n = s.length();
char str[] = s.toCharArray();
Arrays.sort(str); // 输入字符串如果是乱序,则需要先按照从小到大的顺序排列
backtrack(str, 0, n - 1, set);
}
String res[] = new String[set.size()];
int i = 0;
for(String str: set)
{
res[i++] = str;
}
return res;
}
public static void backtrack(char s[], int begin, int end, Set<String> set)
{
if(begin == end)
{
String str = String.valueOf(s);
set.add(str);
}
for(int i = begin; i <= end; i++)
{
swap(s, i, begin); //依次选一个数固定住
backtrack(s, begin + 1, end, set); //让后面的进行全排列
swap(s, i, begin); //恢复原来的模样,回溯关键
}
}
public static void swap(char s[], int i, int j)
{
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext())
{
String str = sc.next();
String res[] = permutation(str);
for(int i = 0; i < res.length; i++)
{
System.out.println(res[i]);
}
System.out.println();
}
}
}