剑指Offer 38.字符串的排列 回溯 Java

该博客介绍了如何使用Java实现字符串的全排列。通过深度优先搜索(DFS)算法,遍历字符串中所有可能的字符排列组合,并存储在结果列表中。示例展示了对于输入字符串's=“abc”',输出所有不重复的排列。代码中使用了HashSet进行字符去重,避免重复排列的出现。

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

剑指Offer 38.字符串的排列

输入一个字符串,打印出该字符串中字符的所有排列,不能重复

示例:输入 s = “abc”

输出 [“abc”, “acb”, “bac”, “bca”, “cab”, “cba”]

import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;

class Solution {

    List<String> result = new LinkedList<>();  //用于存放结果

    char [] c; //用于存放字符串s中每一个字符,并且用于得到每一种排序

    public String[] permutation(String s) {
        c = s.toCharArray(); //初始化c
        dfs(0); //从第0层开始循环
        return result.toArray(new String[result.size()]); //得到结果
    }

    private void dfs(int index) {
        if(index == c.length - 1) { //此时遍历到最后一个字符,将新得到的字符序列转成字符串并且加入list中
            result.add(String.valueOf(c));
            return;
        }
        HashSet<Character> set = new HashSet<>(); //用于判断当前遍历到的字符是否与固定位字符相同
        for(int i = index; i < c.length; i++) {
            if(set.contains(c[i])) continue; //若相同则结束当前循环
            set.add(c[i]); //将字符加入集合中
            swap(i , index); //交换两个字符
            dfs(index + 1); //进入下一层循环
            swap(i , index); //还原至上一次交换前的顺序
        }
    }

    private void swap(int x, int y) { //交换两个字符的位置
        char middle = c[x];
        c[x] = c[y];
        c[y] = middle;
    }
}

public class test {
    public static void main(String [] args) {
        // long startTime = System.currentTimeMillis();    //获取开始时间
        String [] result = new Solution().permutation("abc");
        // long endTime = System.currentTimeMillis();    //获取结束时间
        // System.out.println("用时:" + (endTime - startTime));
        // for (String r :
        //         result) {
        //     System.out.print(r + " ");
        // }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值