剑指Offer Java版 面试题38:字符串的排列

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

练习地址

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7

参考答案

import java.util.ArrayList;
import java.util.Collections;

public class Solution {
    public ArrayList Permutation(String str) {
        ArrayList result = new ArrayList<>();
        if (str == null || str.length() == 0) {
            return result;
        }
        permutation(str.toCharArray(), 0, result);
        // 对结果有序输出
        Collections.sort(result);
        return result;
    }
    
    private void permutation(char[] chars, int start, ArrayList result) {
        if (start == chars.length - 1) {
            result.add(new String(chars));
        } else {
            for (int i = start; i < chars.length; i++) {
                if (chars[i] != chars[start]) {
                    char temp = chars[i];
                    chars[i] = chars[start];
                    chars[start] = temp;
                }
                // 对重复的字母,例如"aa",不会重复输出
                if (i == start || chars[i] != chars[start]) {
                    permutation(chars, start + 1, result);
                }
                if (chars[i] != chars[start]) {
                    char temp = chars[i];
                    chars[i] = chars[start];
                    chars[start] = temp;
                }
            }
        }
    }
}

复杂度分析

  • 时间复杂度:O(n^2)。
  • 空间复杂度:O(n)。

剑指Offer Java版目录
剑指Offer Java版专题

你可能感兴趣的:(剑指Offer Java版 面试题38:字符串的排列)