码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 递归--打印一个字符串的全部排列(java)


    打印一个字符串的全部排列

    • 打印一个字符串的全部排列
    • 解题思路
    • 打印一个字符串的全部排列,要求不要出现重复的排列
    • 递归专题

    打印一个字符串的全部排列

    自负串全排序:
    举例:
    abc 的全排序是:
    abc
    acb
    bac
    bca
    cba
    cab

    解题思路

    因为每个字符都要选,其实就是选择每个字符的顺序,那我们递归时,就可以把不同顺序一直递归下去.

    代码演示

        /**
         * 字符串的全排列
         * @param str
         * @return
         */
        public static List<String> allSubSequence(String str){
            if (str == null || str.equals("")){
                return null;
            }
            //保存答案
            ArrayList<String> ans = new ArrayList<>();
            process(str.toCharArray(),0,ans);
            return ans;
        }
    
        /**
         * 递归
         * @param str 字符串数组
         * @param index  下标值
         * @param ans 保存答案
         */
        public static void process(char[]str, int index, List<String> ans){
            //base case
            if (index == str.length){
                ans.add(String.valueOf(str));
            }else{
                for (int i = index;i < str.length;i++){
                    //因为每个字符都要选,我们只是选择顺序,因此交换下顺序,
                    swap(str,i, index);
                    //然后递归
                    process(str,index + 1,ans);
                    //要把交换过的顺序 恢复回去,这样才能保证递归出全部顺序.
                    swap(str,i,index);
                }
            }
        }
    
    • 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
    • 32
    • 33
    • 34
    • 35
    • 36

    打印一个字符串的全部排列,要求不要出现重复的排列

    解题思路:
    我们可以按上面的代码去做,只需要用HashSet 去保存答案,就会去重了,但这样并没有优化效率,在递归时去掉可能会重复的值,这样才能把效率优化下来,
    怎样优化呢:
    两个相同的字符,如果已经有一个出现过在某个位置,那么剩下相同的字符也不用重复交换了,这样会提高效率
    根据上面的思路,我们只需要加个判断,
    因为字符转换成数字的值在0-255 ,因此用长度256 的数组就可以标记了,代码演示,

    代码演示,

        /**
         * 打印一个字符串的全部排列,要求不要出现重复的排列
         * @param str
         * @return
         */
        public static List<String> allSubSequence2(String str){
            if (str == null || str.equals("")){
                return null;
            }
            ArrayList<String> ans = new ArrayList<>();
            process2(str.toCharArray(),0,ans);
            return ans;
        }
    
        /**
         * 递归
         * @param str
         * @param index
         * @param ans
         */
        public static void process2(char[]str, int index, List<String> ans){
            if (index == str.length){
                ans.add(String.valueOf(str));
            }else{
                //标记相同的字符是否交换过,
                boolean[] flag = new boolean[256];
                for (int i = index;i < str.length;i++){
                    if (!flag[str[i]]){
                        flag[str[i]] = true;
                        swap(str,i, index);
                        process(str,index + 1,ans);
                        swap(str,i,index);
                    }
    
                }
            }
        }
    
    
    • 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
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38

    递归专题

    递归–字符串的全部子序列和不重复的子序列(java)

    递归–汉诺塔问题(java)

  • 相关阅读:
    java计算机毕业设计高校实习管理平台系统源码+mysql数据库+系统+lw文档+部署
    前端经常遇到的手写js题
    springboot+视频网站 毕业设计-附源码240925
    固定资产电脑怎么编号管理
    JUC并发编程——Volatile详解(基于狂神说的学习笔记)
    【值得反复看反复思考】博弈心理学完结撒花(精华篇)
    java-net-php-python-jsp社会公共常识科普网的设计与实现计算机毕业设计程序
    华为云云耀云服务器L实例评测|企业项目最佳实践之docker部署及应用(七)
    算法|每日一题|求一个整数的惩罚数|回溯
    [springboot]jasypt加密
  • 原文地址:https://blog.csdn.net/SP_1024/article/details/130906064
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号