剑指offer -- 字符串的排列

题目描述

输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

  • 输入描述:

输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。

AC代码1

import java.util.ArrayList;
public class Solution {
    ArrayList<String> resList = new ArrayList<>();
    public ArrayList<String> Permutation(String str) {
        if(str == null || str.length() == 0) return resList;
        boolean seen[] = new boolean[str.length()];
        PermutationCore(str, new StringBuilder(), seen);
        return resList;
    }
    
    private void PermutationCore(String str, StringBuilder sb, boolean seen[]){
        if(sb.length() == str.length()){
            if(!resList.contains(sb.toString()))
            resList.add(sb.toString());
            return;
        }
        for(int i = 0;i < str.length();i++){
            if(!seen[i]){
                sb.append(str.charAt(i));
                seen[i] = true;
                PermutationCore(str, sb, seen);
                seen[i] = false;
                sb.deleteCharAt(sb.length() - 1);
            }
        }
    }
}

AC代码2

import java.util.*;
public class Solution {
    ArrayList<String> resList = new ArrayList<>();
    public ArrayList<String> Permutation(String str) {
        if(str == null || str.length() == 0) return resList;
        boolean seen[] = new boolean[str.length()];
        char[] charArr = str.toCharArray();
        Arrays.sort(charArr);
        //str = new String(charArr);
        PermutationCore(charArr, new StringBuilder(), seen);
        return resList;
    }
    
    private void PermutationCore(char[] charArr, StringBuilder sb, boolean seen[]){
        if(sb.length() == charArr.length){
            resList.add(sb.toString());
            return;
        }
        for(int i = 0;i < charArr.length;i++){
            if(!seen[i]){
                if(i > 0 && charArr[i] == charArr[i - 1] && seen[i - 1]) continue;
                sb.append(charArr[i]);
                seen[i] = true;
                PermutationCore(charArr, sb, seen);
                seen[i] = false;
                sb.deleteCharAt(sb.length() - 1);
            }
        }
    }
}

你可能感兴趣的:(算法,剑指offer)