剑指Offer38.字符串的排序
题目链接:字符串的排序
思路:全排列字符顺序,要去重。先排序,因为想把重复的字符放在一起,这样遍历的时候方便处理重复的字符串;然后递归地遍历每个位置,组合所有情况。
代码:
class Solution {
private List<String> list = new ArrayList<>();
public String[] permutation(String s) {
char[] ss = s.toCharArray();
int[] vis = new int[s.length()];
Arrays.sort(ss);
helper(ss, vis, new StringBuilder());
return list.toArray(new String[list.size()]);
}
private void helper(char[] ss, int[] vis, StringBuilder sb){
if(sb.length() >= ss.length){
list.add(sb.toString());
return ;
}
for(int i=0; i<ss.length; i++){
if(vis[i] == 1) continue;
vis[i] = 1;
sb.append(ss[i]);
helper(ss, vis, sb);
vis[i] = 0;
sb.deleteCharAt(sb.length() - 1);
while(i+1<ss.length && ss[i] == ss[i+1]) i++;
}
}
}
执行用时:10 ms, 在所有 Java 提交中击败了76.72%的用户
内存消耗:42.7 MB, 在所有 Java 提交中击败了86.46%的用户
笔记:
- 在题解中,通过交换字符顺序实现组合,这样就不用记录访问了哪个元素,因为被访问的元素都通过交换放到了每层递归的前列。
- List转数组的方法:
<T> T[] List.toArray(T[] a)
。