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

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

练习地址

https://www.nowcoder.com/practice/fe6b651b66ae47d7acce78ffdd9a96c7
https://leetcode-cn.com/problems/zi-fu-chuan-de-pai-lie-lcof/

参考答案

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

public class Solution {
    public ArrayList<String> Permutation(String str) {
        ArrayList<String> 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<String> 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!)。
  • 空间复杂度:O(n)。

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容