剑指 Offer 38. 字符串的排列
又是一个回溯法的题目,但难度更大了,很多地方容易出错
主要是多了可能的重复
二是字符数组和字符串的转换问题
这题的核心在于交换,我们可以想象为
确认第一位的值,就是将第1位和其他所有位做交换,做完交换后的后面的元素就是剩下的可选列表
去重时则需要使用到HashSet
“这个技巧应该之前的数字排列的回溯法题都能用”,比修改选择列表和路径/把路径弄成HashSet都要省时间
class Solution { List<String> res=new LinkedList<>();//结果,先用集合框架存储 public String[] permutation(String s) { char[] charArray=s.toCharArray(); backtracking(charArray,0); return res.toArray(new String[res.size()]); } private void backtracking(char[] chars,int indexFrom) { //返回条件 if(indexFrom==chars.length-1) { res.add(String.valueOf(chars));//字符数组转字符串 return; } Set<Character> charSet=new HashSet<>(); int length=chars.length;//是.length for(int i=indexFrom;i<length;i++) { // if(charSet.contains(char[])) 怎么去重? if(charSet.contains(chars[i])) { continue; } charSet.add(chars[i]); swap(chars,indexFrom,i); backtracking(chars,indexFrom+1);//数组不会越界 swap(chars,indexFrom,i); } } private void swap(char[] chars,int indexFrom,int indexTo)//交换指定位置字符 { char temp=chars[indexFrom]; chars[indexFrom]=chars[indexTo]; chars[indexTo]=temp; } }
注意字符数组和字符串的转换:
char[] charSet={'a','b'}; String str=String.valueOf(charSet);//字符数组转字符串 String str1="sdfd"; char[] charSet1=str1.toCharArray();//字符串转字符数组
注意集合转数组
return res.toArray(new String[res.size()])
这样转成数组后才是有泛型的,如果是return res.toArray(); 则是一个Object类型的数组