剑指 Offer 38. 字符串的排列 + 无重复元素的全排列

剑指 Offer 38. 字符串的排列

Offer_38

题目描述

解题思路

  1. 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列。
  2. 但是考虑到本题需要排除重复的排列,所以可以递归时判断同一个字符是否出现在某个位置多次,如果出现多次则跳过。

java代码

package com.walegarrett.offer;


/**
 * @Author WaleGarrett
 * @Date 2021/2/5 22:45
 */

import java.util.LinkedList;
import java.util.List;
import java.util.TreeSet;

/**
 * 题目详情:输入一个字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。
 * 解题思路:可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列。但是考虑到本题需要排除重复的排列,
 * 所以可以递归时判断同一个字符是否出现在某个位置多次,如果出现多次则跳过。
 */
public class Offer_38 {
    List<String> result = new LinkedList<>();
    char[] chs;
    public String[] permutation(String s) {
        chs = s.toCharArray();//将字符串s转换为字符数组
        dfs(0);
        return result.toArray(new String[result.size()]);
    }
    void dfs(int num){
        if(num == chs.length - 1){
            result.add(String.valueOf(chs));
            return;
        }
        TreeSet<Character> treeSet = new TreeSet<>();
        for(int i = num; i<chs.length; i++){
            if(treeSet.contains(chs[i])){
                continue;
            }
            treeSet.add(chs[i]);
            swap(i, num);
            dfs(num + 1);
            swap(i, num);
        }
    }
    void swap(int a, int b){
        char temp = chs[b];
        chs[b] = chs[a];
        chs[a] = temp;
    }

}

posted @   Garrett_Wale  阅读(119)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
历史上的今天:
2020-02-06 LanQiao-297(快速排序)
点击右上角即可分享
微信分享提示