Loading

剑指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)
posted @ 2020-12-27 15:51  yoyuLiu  阅读(42)  评论(0编辑  收藏  举报