与首个字符交换
字符串的排列
http://www.nowcoder.com/questionTerminal/fe6b651b66ae47d7acce78ffdd9a96c7
第一个字符+剩余所有字符。回溯是注意状态的恢复。
/**
*输入一个字符串,按字典序打印出该字符串中字符的所有排列。
* 例如输入字符串abc,则按字典序打印出由字符a,b,c所能排列出来的
* 所有字符串abc,acb,bac,bca,cab和cba。
* @param str 字符串
* @return 排列得到的所有字符串
*/
public ArrayList<String> Permutation(String str) {
chars=str.toCharArray();
Permutation(0);
permutes.sort(String::compareTo);
return permutes;
}
private ArrayList<String> permutes=new ArrayList<>();
private char[] chars;
public void Permutation(int starIndex){
if(starIndex==chars.length-1){
permutes.add(String.valueOf(chars));
}
Set<Character> set=new HashSet<>();
for(int i=starIndex;i<chars.length;i++){
if(set.contains(chars[i])){
continue;
}
set.add(chars[i]);
//chars[i] 固定在第 starIndex 位
char temp=chars[i];
chars[i]=chars[starIndex];
chars[starIndex]=temp;
Permutation(starIndex+1);
temp=chars[i];
chars[i]=chars[starIndex];
chars[starIndex]=temp;
}
}
查看4道真题和解析
