之前面试的时候做过这个题目,当时用了很笨的穷举法,今天在网上看到了一个感觉比较高级的递归法,学习一下。不过话说算法复杂度不一定比穷举法低。以下是原文(略有修改)。
其实在这个问题上看似很简单,但是对数组和字符处理不够熟练,就会显的很麻烦.
import java.util.ArrayList;
import java.util.List;
public class Permutation {
public static List<String> permutation = new ArrayList<String>();
public static void main(String[] args) {
char[] numbers = new char[]{'1','2','2','3','4','5'};
permute(numbers, 0, numbers.length-1);
for(String str:permutation){
System.out.println(str);
}
}
private static void permute(char[] n, int cur, int end) {
if(cur == end){
String str = new String(n);
if(permutation.contains(str)||str.charAt(2)=='4'||str.contains("35")
||str.contains("53"))
return;
permutation.add(str);
return;
}
for(int i=cur; i<=end; i++){
swap(n, cur, i);
permute(n, cur+1, end);
swap(n, cur, i);
}
}
private static void swap(char[] n, int cur, int i) {
char temp = n[cur];
n[cur] = n[i];
n[i] = temp;
}
}