美文网首页
38-字符串的排列-排列组合

38-字符串的排列-排列组合

作者: 一方乌鸦 | 来源:发表于2020-05-06 09:15 被阅读0次

    排列

    输入一个字符串,打印出该字符串中字符的所有排列。

    排列算法基于交换,将当前项与后面的每一项都进行一次交换,就都是一次排列。
    组合算法基于选择,需要新开一个 集合,将一项加入到集合后,还要将后面的项再加进来,集合 大小满足要求后,就是一次组合。

    首先需要知道到如何使用递归求出排列,index从0开始:

        public void permutation(char[] c, int index) {
            if (index == c.length - 1) {
                new String(c);
            } else {
                for (int i = index; i < c.length; i++) {
                    swap(c, index, i);
                    permutation(c, index + 1);
                    swap(c, index, i);
                }
            }
        }
    

    如果数组中有重复的字母,需要使用一个HashSet去重:

    class Solution {
        private char[] array;
        private LinkedList<String> list = new LinkedList<>();
        public String[] permutation(String s) {
            array = s.toCharArray();
            recur(0);
            return list.toArray(new String[list.size()]);
        }
    
        private void recur(int index) {
            if (index == array.length - 1) list.add(new String(array));
            HashSet<Character> set = new HashSet<>();
            for (int i = index; i < array.length; i++) {
                if (set.contains(array[i])) continue;
                set.add(array[i]);
                swap(index, i);
                recur(index + 1);
                swap(index, i);
            }
        }
    
        private void swap(int i, int j) {
            char tmp = array[i];
            array[i] = array[j];
            array[j]= tmp;
        }
    }
    

    组合

    返回 1 ... n 中所有可能的 k 个数的组合。(leetcode-77)

    class Solution {
        int n;
        int k;
        List<List<Integer>> res = new LinkedList<>();
        public List<List<Integer>> combine(int n, int k) {
            this.n = n;
            this.k = k;
            combine(1, new LinkedList<Integer>());
            return res;
        }
    
        private void combine(int i, LinkedList<Integer> list) {
            if (list.size() == k) {
                res.add(new LinkedList<>(list));
                return;
            }
            for (int j = i; j <=n; j++) {
                list.add(j);
                combine(j + 1, list);
                list.removeLast();
            }
        }
    }
    

    相关文章

      网友评论

          本文标题:38-字符串的排列-排列组合

          本文链接:https://www.haomeiwen.com/subject/kiefghtx.html