回溯法
import java.util.*;
public class Solution {
public ArrayList<String> Permutation(String str) {
ArrayList<String>res = new ArrayList<>();
char[]chars = str.toCharArray();
helpPermutation(chars,0,res);
//res中的字符串元素是无序的
Collections.sort(res);
return res;
}
public void helpPermutation(char[]chars,int start,ArrayList<String>res){
if(start==chars.length-1)
res.add(new String(chars));
else{
for(int i=start;i<chars.length;i++)
if(!equals(chars,start,i)){
swap(chars,start,i);
helpPermutation(chars,start+1,res);
swap(chars,start,i);
}
}
}
//判断当前元素与将要更改的元素之间有没有元素和将更改的元素相同
public boolean equals(char[]chars,int start,int end){
for(int i=start;i<end;i++){
if(chars[i]==chars[end])
return true;
}
return false;
}
//交换元素
public void swap(char[]chars,int start,int end){
char tem = chars[start];
chars[start]=chars[end];
chars[end]=tem;
}
}
因为有重复,所以要做额外的去重工作:
比如 1223,更改成2123;2+per(1,2,3)
1能不能和第二个2交换呢??是不能的,2213=>2+per(1,2,3)
记住123在字符串中是有序的,但是他和(213)的全排列结果是一样的,只要他们的元素是一样就行了啊!!!
所以说当第一次遇到一个元素没问题,第二次遇到的话就会产生重复。
这篇博文仅供对equals函数有疑问的人看。