• 暴力递归-打印字符串全部序列


    题目:打印一个字符串的全部序列,不能出现重复的排序

    package Algorithms.ViolenceRecursive;
    
    import java.util.ArrayList;
    
    public class PrintAllPermutations {
    
        public static ArrayList<String> Permutation(String str) {
            ArrayList<String> res = new ArrayList<>();
            if (str == null || str.length() == 0) {
                return res;
            }
            char[] chs = str.toCharArray();
            process(chs, 0, res);
            res.sort(null);
            return res;
        }
    
        //str[i...]范围上,所有的字符都可以在i位置上,后续都去尝试
        //str[0...i-1]范围上,是之前做的选择
        //请把所有的字符串形成的全排列,加入到res里去
        public static void process(char[] chs, int i, ArrayList<String> res) {
            if (i == chs.length) {
                res.add(String.valueOf(chs));
            }
            boolean[] visit = new boolean[26]; //存放试过的字符
            for (int j = i; j < chs.length; j++) {
                if (!visit[chs[j] - 'a']) { //若字符没有试过
                    visit[chs[j] - 'a'] = true;  //存放到visit中
                    swap(chs, i, j);
                    process(chs, i + 1, res);
                    swap(chs, i, j);
                }
            }
        }
    
        public static void swap(char[] chs, int i, int j) {
            char tmp = chs[i];
            chs[i] = chs[j];
            chs[j] = tmp;
        }
    
        public static void main(String[] args) {
            String str = "abc";
            ArrayList<String> p = Permutation(str);
            for (String s:p){
                System.out.println(s.toString());
            }
        }
    }
    /**
     * abc
     * acb
     * bac
     * bca
     * cab
     * cba
     */
  • 相关阅读:
    如何使用Log4j
    HDU 1114
    老鼠与毒药问题
    HDU 1065
    HDU 1301(MST)
    HDU 1078
    HDU 2159
    删除字符问题(贪心)
    正整数分解为几个连续自然数之和
    OpenJudge
  • 原文地址:https://www.cnblogs.com/zh-xiaoyuan/p/15146984.html
Copyright © 2020-2023  润新知