zoukankan      html  css  js  c++  java
  • 剑指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)
  • 相关阅读:
    Periodic Strings ( UVA
    Digit Counting ( UVA
    Molar mass ( UVA
    Score ( UVA
    Let the Balloon Rise (STL)
    Tree Recovery (STL)
    安卓simpleadapter问题
    安卓活跃手指问题
    python 问题记录
    设计模式笔记
  • 原文地址:https://www.cnblogs.com/liuyongyu/p/14197514.html
Copyright © 2011-2022 走看看