Blage's Coding Blage's Coding
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
Home
算法
  • 手写Spring
  • SSM
  • SpringBoot
  • JavaWeb
  • JAVA基础
  • 容器
  • Netty

    • IO模型
    • Netty初级
    • Netty原理
  • JVM
  • JUC
  • Redis基础
  • 源码分析
  • 实战应用
  • 单机缓存
  • MySQL

    • 基础部分
    • 实战与处理方案
    • 面试
  • ORM框架

    • Mybatis
    • Mybatis_Plus
  • SpringCloudAlibaba
  • MQ消息队列
  • Nginx
  • Elasticsearch
  • Gateway
  • Xxl-job
  • Feign
  • Eureka
  • 面试
  • 工具
  • 项目
  • 关于
🌏本站
🧸GitHub (opens new window)
  • 数组

  • 链表

  • 字符串

  • 二叉树

  • 动态规划

  • 深搜回溯

    • 46.全排列
    • 93.复原IP地址
    • 1079.活字印刷
    • 6441. 求一个整数的惩罚数
    • 47. 全排列 II
    • 78. 子集
    • 79. 单词搜索
    • 207. 课程表
    • 399. 除法求值
    • 22. 括号生成
    • 39. 组合总和
    • 2746. 字符串连接删减字母
    • 931. 下降路径最小和
    • 40. 组合总和 II
    • 332. 重新安排行程
    • 51. N 皇后
    • 37. 解数独
    • 2050. 并行课程 III
    • 841. 钥匙和房间
    • 2850. 将石头分散到网格图的最少移动次数
    • 2316. 统计无向图中无法互相到达点对数
    • 剑指offer12
    • 剑指offer38
  • 数学贪心

  • 堆栈队列

  • 前缀和

  • 算法设计

  • 位运算

  • WA

  • 算法
  • 深搜回溯
phan
2023-05-16

剑指offer38

# 剑指offer38

输入字符串,打印出该字符串中字符的所有排列。你可以以任意顺序返回这个字符串数组,里面不能有重复元素。

输入:s = "abc" 输出:["abc","acb","bac","bca","cab","cba"]

  1. String.valueOf(char[] data):将char[]数组转换成String
  2. list.toArray(new String[list.size()])把list容器转化为指定类型的数组
  3. Set容器(不容许有重复元素的集合):HashSet<String> site=new HashSet<>()
  4. Set方法:add(),remove(String),contains(String)

dfs+回溯。用一个全局的visit数组来记录下使用过的字符 ,回溯前再置为0。 一开始去重用的是!list.contains(String),后面发现超时了。然后又改成HashSet容器来装字符串数组,居然能AC,可能这就是HashSet的魅力吧。减少时间的关键在于剪支,同一个位置(意味着同一个dfs内的循环)如果是先前使用过的字符则可直接continue,所以在每一个dfs都要开辟一个HashSet来记录当前位置使用过的字符。剪枝过后就不需要去重。

class Solution {
    int[] visit=new int[8]; 
    HashSet<String> list=new HashSet<>();
    public String[] permutation(String s){
            char[] temp=new char[s.length()];
            dfs(s,temp,0);                     
            return list.toArray(new String[list.size()]);
    }
    public void dfs(String s,char[] temp,int charindex)
    {
        if(s.length()==charindex)
        {     
            list.add(new String(temp,0,s.length()));              
            return;
        }
        HashSet<Character> v=new HashSet<>(); //真正的剪枝
        for(int i=0;i<s.length();i++)
        {
            if(visit[i]==0&&!v.contains(s.charAt(i)))
            {
                visit[i]=1;
                v.add(s.charAt(i));
                temp[charindex]=s.charAt(i);
                dfs(s,temp,charindex+1);               
                visit[i]=0;
                if(charindex==s.length()-1) //假的剪枝
                return;
            }                       
        }
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
编辑 (opens new window)
#Leetcode#回溯
上次更新: 2023/12/15, 15:49:57
剑指offer12
LCP 33. 蓄水

← 剑指offer12 LCP 33. 蓄水→

Theme by Vdoing | Copyright © 2023-2024 blageCoder
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式