【日常训练】剑指 Offer 38. 字符串的排列

该博客介绍了如何使用深度优先搜索(DFS)算法解决字符串全排列问题。代码示例展示了如何通过Java实现DFS,遍历字符串中字符的所有可能排列,并避免重复。示例输入为字符串abc,输出包括所有六个排列组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

输入一个字符串,打印出该字符串中字符的所有排列。

你可以以任意顺序返回这个字符串数组,但里面不能有重复元素。

示例:
输入:s = “abc”
输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”]

限制:
1 <= s 的长度 <= 8

代码:

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * @author :Puppet
 * @description:剑指 Offer 38
 * @date :2021/11/11 16:51
 */
public class StringSort {
    /**
     * DFS
     * 该题目一看就是裸的dfs
     * 我们不断地去将元素的位置进行交换
     */
    char[] ch;
    List<String> list = new ArrayList<>();
    public String[] permutation(String s) {
        ch = s.toCharArray();
        dfs(0);
        return list.toArray(new String[list.size()]);
    }

    public void dfs(int index){
        //结束条件:如果所有元素都在该排列中就加入list中,即到叶子结点
        if (index == ch.length - 1){
            list.add(new String(ch));
            return;
        }

        HashSet<Character> set = new HashSet<>();
        for (int i = 0; i < ch.length; i++){
            //元素不能重复,利用此点进行剪枝
            if (set.contains(ch[i])) continue;
            //使用过就将其加到set中,其实这里也可以使用一个visted[]数组进行标记
            set.add(ch[i]);
            swap(i,index);
            //继续往下搜索
            dfs(index + 1);
            swap(i,index);
        }
    }

    private void swap(int i, int j){
        char tmp = ch[i];
        ch[i] = ch[j];
        ch[j] = tmp;
    }

    public static void main(String[] args) {
        StringSort stringSort = new StringSort();
        String[] strings = stringSort.permutation("abc");
        for (String str : strings){
            System.out.println(str);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值