递归--打印一个字符串的全部排列(java)

这篇具有很好参考价值的文章主要介绍了递归--打印一个字符串的全部排列(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);
            }
        }
    }

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

解题思路:
我们可以按上面的代码去做,只需要用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);
                }

            }
        }
    }

递归专题

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

递归–汉诺塔问题(java)文章来源地址https://www.toymoban.com/news/detail-461974.html

到了这里,关于递归--打印一个字符串的全部排列(java)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java判断一个字符串是否包含某个字符串

    开发过程中,有时会判断一个字符串是否包含某个字符串的操作,这里总结判断方法。 方式一:contains()方法         理解:contains() 方法用于判断字符串中是否包含指定的字符或字符串。(判断一个字符串是否包含某个字符串)         语法:public boolean contains(CharSequence

    2024年02月13日
    浏览(96)
  • java获取字符串最后一个字符

    要获取字符串的最后一个字符,你可以使用以下方法之一: 方法1:使用 charAt() 方法 方法2:使用 substring() 方法 在这两种方法中,我们使用 str.length() - 1 来获取字符串的最后一个字符的索引,然后使用 charAt() 方法 或将最后一个字符作为子字符串使用 substring() 方法。 请注意

    2024年02月03日
    浏览(49)
  • 获取字符串的全排列(去除字符串中2个字符相同时造成的重复)

    一、概念 现有一个字符串,要打印出该字符串中字符的全排列。 以字符串abc为例,输出的结果为:abc、acb、bac、bca、cab、cba。 以字符串aab为例,输出的结果为:aab、aba、baa。 二、代码 致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分

    2024年04月16日
    浏览(40)
  • C++将字符串中包含指定字符串范围内的字符串全部替换

    将指定字符串所在的范围之内的字符串全部替换为指定的字符串。如: 源字符串: 转换后的字符串: 或者转换为: 本文就是记录一种将上述字符串替换成功的方法。其中转换之后的第一个字符串,实际上是将原有字符串中 “$START$” 和 “$END$” 替换为 “” (空字符串);

    2024年02月07日
    浏览(57)
  • Java判断一个字符串是否包含某个字符

    1 问题 如何利用Java通过不同的方法来判断一个字符串是否包含某个字符。 2 方法 .contains方法 这个是利用java.lang.String.contains() 方法返回true,当且仅当此字符串包含指定的char值序列,此方法返回true,如果此字符串包含,否则返回false。 (2).indexOf方法 这一个是利用java.lang.Str

    2024年02月16日
    浏览(97)
  • 【Java】Java去掉字符串最后一个逗号的方法

    Java中去掉字符串最后一个逗号的方法有很多种,其中最简单的一种是使用substring方法。具体的方法是:先找到字符串中最后一个逗号的位置,然后使用substring方法截取逗号前的部分。 这样就可以把字符串末尾的逗号去掉了,输出结果为:a,b,c。 需要注意的是,这种方法只能

    2024年02月03日
    浏览(44)
  • [开发|java] 将一个Java字符串按逗号分割成一个列表(List)

    可以使用Java的 split() 方法将字符串分割成字符串数组,然后将数组转换为列表。以下是一个示例代码: 输出 在上述代码中,我们使用 split(\\\",\\\") 方法将字符串 str 按逗号分割成一个字符串数组,然后使用 Arrays.asList() 方法将数组转换为列表。最后,我们打印输出列表的内容。

    2024年02月16日
    浏览(59)
  • Java中如何获取一个字符串是什么类型

    在Java中,您可以使用一些方法来确定一个字符串的类型。下面是一些常用的方法: 使用正则表达式:您可以使用正则表达式来匹配字符串是否符合特定的模式或格式,以确定其类型。例如,使用matches()方法可以检查字符串是否匹配某个特定的正则表达式模式。 使用内置方法

    2024年02月09日
    浏览(43)
  • 31 对集合中的字符串,按照长度降序排列

            思路:使用集合的sort方法,新建一个Comparator接口,泛型是String,重写里面的compare方法。         运行结果:          扩充:点击Comparator,查看接口内部:发现加了@FunctionalInterface,说明可以使用箭头函数,直接使用箭头函数就能表示Comparator接口以及它的compara

    2024年02月14日
    浏览(47)
  • (搜索) 剑指 Offer 38. 字符串的排列 ——【Leetcode每日一题】

    难度:中等 输入一个字符串,打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组,但里面 不能有重复元素 。 示例: 输入:s = “abc” 输出:[“abc”,“acb”,“bac”,“bca”,“cab”,“cba”] 限制 : 1 = s 的长度 = 8 💡思路:回溯 可以直接 暴力穷举 ,但

    2024年02月12日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包