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

news2024/11/15 15:37:26

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

方法一:暴力方法。

在这里插入图片描述

	//方法一:暴力方法。
    public static List<String> permutation1(String s) {
        //str是一个存储字符类型的有序表。
        ArrayList<Character> str = new ArrayList<>();
        //将字符串中的类型存储在str中。
        for (Character c : s.toCharArray()) {
            str.add(c);
        }
        String path = "";
        List<String> ans = new LinkedList<>();
        process(str, path, ans);
        return ans;
    }

    //str:字符数组。
    //path:记录之前选择的答案。
    //ans:记录最终的结果。
    public static void process(ArrayList<Character> str, String path, List<String> ans) {
        if (str.isEmpty()) {
            ans.add(path);
            return;
        }


        for (int i = 0; i < str.size(); i++) {
            char value = str.get(i);
            str.remove(i);
            process(str, path + String.valueOf(value), ans);
            //还原现场,之前在那就放在哪。
            str.add(i, value);
        }
    }

注意要还原现场,之前在哪个位置,就放回到哪个位置上去,保证原始数据的整洁性。

因为如果数据一旦混乱,就会出现结果的不准确。

举个例子:

"a b c d " 刚开始选a作为开头,剩下的bcd进入递归,最终将以a为开头的数据记录完成。从递归出来,然后str.add( value);

直接将a尾插,假设现在的 str = bcda,然后i++; i ==1,从str中拿出的下一个数据是c,而不是我想要的b,我们的到的结果都乱了。

由此可知,递归完成出来之后,之前什么位置的数就放回什么位置。这样保证了数据的完整性。

方法二:进行交换的方法。

	//方法二:
    public static List<String> permutation2(String s) {
        char[] str = s.toCharArray();
        List<String> ans = new LinkedList<>();
        process(str, 0, ans);
        return ans;
    }

	//index:表示的是当前的位置。
    public static void process(char[] str, int index, List<String> ans) {
        if (index == str.length) {
            ans.add(String.valueOf(str));
            return;
        }

        for (int i = index; i < str.length; i++) {
            swap(str, index, i);
            process(str, index + 1, ans);
            //还原现场,之前在那就放在哪。
            swap(str, index, i);
        }
    }

    public static void swap(char[] str, int i, int j) {
        char temp = str[i];
        str[i] = str[j];
        str[j] = temp;
    }

注意这里还是需要还原现场,之前在哪里的就放回到哪里。

比如:

在这里插入图片描述

0跟2交换的时候,a又跑到头上去了,而我想要的是c在头上。之所以出现这种情况是因为数据全乱了,在乱的数据上进行交换,会导致部分结果无法得到。

想得到正确的结果,必须在干净的数据(原始数据)上进行变换,所以每一步操作完了,就还原现场,保证数据跟原始数据一致。

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

剪枝策略:

	//打印一个字符串的全部排列,要求不要出现重复的排列
    public static List<String> permutation3(String s) {
        char[] str = s.toCharArray();
        List<String> ans = new LinkedList<>();

        process2(str, 0, ans);
        return ans;
    }

    public static void process2(char[] str, int index, List<String> ans) {
        if (index == str.length) {
            ans.add(String.valueOf(str));
            return;
        }

        boolean[] visited = new boolean[256];// ------------------------------------注意
        for (int i = index; i < str.length; i++) {
            //str[i] -> 找到该字符的ASCII码,visited[str[i]] -> 判断该字符之前是否存在过。
            if (!visited[str[i]]) {
                visited[str[i]] = true;
                swap(str, index, i);
                process2(str, index + 1, ans);
                //还原现场,之前在那就放在哪。
                swap(str, index, i);
            }
        }
    }

boolean[] visited = new boolean[256];这个数组的位置至关重要。

每一层创建一个visited 数组来判断这一层中某个字符是否出现过。并不是全局就创建一个visited 数组如果这样的话,结果就会出现错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/623860.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Zookeeper概述

​ ZooKeeper概述 ZooKeeper是什么 zookeeper是一个为分布式应用程序提供的一个分布式开源协调服务框架。是Google的Chubby的一个开源实现&#xff0c;是Hadoop和Hbase的重要组件。主要用于解决分布式集群中应用系统的一致性问题。提供了基于类似Unix系统的目录节点树方式的数…

docker 安装 nsq

一. nsq介绍 nsq介绍 NSQ是一个基于Go语言&#xff0c;由bitly公司开源出来的一款简单易用的消息中间件。 官方和第三方开发了众多客户端功能库&#xff0c;如基于HTTP的nsqd、Go客户端go-nsq、Python客户端pynsq、基于Node.js的JavaScript客户端nsqjs、异步C客户端libnsq、J…

JavaSE-02【类型转换和运算符】

第一章&#xff1a;数据类型转换 Java程序中要求参与计算的数据&#xff0c;必须要保证数据类型的一致&#xff0c; 如果数据类型不一致则发生类型的转换1.1 自动转换 自动转换&#xff1a;将取值范围小的类型自动提升为取回范围大的类型 自动类型转换原理&#xff1a;一个i…

MySql锁知识记录积累(一)

1.关于脏读、幻读和不可重复读 脏读&#xff1a;一个事务A读取到了另一个事务B未提交的数据&#xff0c;叫做脏读 不可重复读&#xff1a;事务A被事务B干扰到了&#xff01;在事务A范围内&#xff0c;两个相同的查询&#xff0c;读取同一条记录&#xff0c;却反返回了不同的结…

运行一个新vue项目踩坑

npm install报错了&#xff0c;主要是因为node版本太高了。去node官网&#xff0c;下载低版本的msi后缀的文件&#xff0c;运行安装。在vs code里&#xff0c;npm下载依赖&#xff0c;并运行即可。 1. 无法cnpm cnpm : 无法加载文件 D:\Program Files\nodejs\node_global\cnpm.…

前端放大镜效果实现

放大镜效果实现 放大图片的需求&#xff0c;一般是在原有的渲染之上&#xff0c;额外添加一个放大框&#xff0c;当鼠标在原图上移动&#xff0c;放大框内就以当前的鼠标为中心&#xff0c;局部放大一定范围&#xff0c;在淘宝商城中是常有的实现。下面将用两种实现。 1、使用d…

是德 DSOX1202A示波器技术参数

KEYSIGHT是德科技 lnfiniiVision 1000 X 系列示波器是具有专业级功能的入门级示波器&#xff0c;配备的联网软件可提供远程控制和数据记录等功能。 它集 6 种仪器的功能于一身&#xff0c;属于是德科技智能测试台必备仪器之一。该系列包含 4 款独具特长的仪器&#xff0c;通过同…

5年功能测试要18K,一问三不知,还反过来怼我,真是醉了····

最近看了很多简历&#xff0c;很多候选人年限不小&#xff0c;但是做的都是一些非常传统的项目&#xff0c;想着也不能通过简历就直接否定一个人&#xff0c;何况现在大环境越来 越难&#xff0c;大家找工作也不容易&#xff0c;于是就打算见一见。 在沟通中发现&#xff0c;由…

坚持#第418天~久违了,二维码系统

公司有了一个新客户&#xff0c;这家客户的货物都是用铁架框装的&#xff0c;铁架框长得都一样&#xff0c;不好区分&#xff0c;只能看标签来识别&#xff0c;而且发货时需要一一核对发货单上的交货单号对应的货物&#xff0c;标签上的发货单号必须要一致才行&#xff0c;导致…

【干货】Kali Linux渗透基础知识大全,零基础入门必看!

最近好多朋友问我&#xff1a;不会编程&#xff0c;英语也不好&#xff0c;dos命令也记不住&#xff0c;能学习黑客技术么&#xff1f; 我可以明确告诉大家&#xff0c;可以的&#xff01; 相信每一个少年心中&#xff0c;曾经都有过一个黑客梦&#xff01; 有人觉得黑客霸气…

常用的开源自定义表单有哪几大优势特点?

当前&#xff0c;办公已经进入流程化和自动化的阶段&#xff0c;要想跟随着社会发展&#xff0c;引用开源自定义表单工具可以使办公协作效率得到快速提升&#xff0c;它的灵活、便捷、易操作等特点&#xff0c;使得该表单工具深受当今职场的喜爱&#xff0c;是做好数据管理&…

Flutter 库:强大的下拉刷新上拉加载框架——EasyRefresh

Flutter 库&#xff1a;强大的下拉刷新上拉加载框架——EasyRefresh 文章目录 Flutter 库&#xff1a;强大的下拉刷新上拉加载框架——EasyRefresh一、概述1、简介2、特征3、在线演示4、APK下载5、接口参考 二、官方示例1、默认构造函数2、生成器构造函数3、指示器定位4、使用指…

2023年网络安全HW攻防技术总结(珍藏版)

2022年护网正当时&#xff0c;相信不少网安人都已经进入了状态。 我们都知道&#xff0c; 护网行动 是国家应对网络安全问题所做的重要布局之一。至今已经是7个年头了&#xff0c;很多公司在这时候人手不够&#xff0c;因此不得不招募一些网安人员来参加护网。 红队 扮演攻击…

Linux搭建Java环境——安装JDK

一、上传jdk1.8文件 首先通过Xftp 7软件&#xff0c;将jdk文件传输到Linux上&#xff08;连接和Xshell 7方法相同&#xff0c;软件资源在首页中的下载栏处免费获取&#xff09;当然需要在opt文件夹下先新建jdk的文件夹 二、解压jdk文件 解压完成后可以发现蓝色的jdk1.8的目录生…

Android Studio实现五子棋小游戏

项目目录 一、项目概述二、开发环境三、详细设计1、布局设计2、验证码3、AI人机4、背景音乐 四、运行演示五、项目总结 一、项目概述 五子棋是一种两人对弈的策略型棋类游戏&#xff0c;本次五子棋小游戏具有人机对战和人人对战两种玩法。人机对战可以单人挑战AI&#xff0c;实…

SQL语言的规则与规范

SQL语言的规则与规范 前言一、SQL概述1、SQL背景知识2、SQL语言排行榜3、SQL 分类 二、SQL语言的规则与规范1、基本规则2、SQL大小写规范 &#xff08;建议遵守&#xff09;3、注 释4、命名规则&#xff08;暂时了解&#xff09;5、数据导入指令 前言 本博主将用CSDN记录软件开…

怎么用pe系统重装系统,如何用pe重装系统

其实&#xff0c;电脑装系统并没有这么难&#xff0c;尤其是u盘pe系统相对来说比较简单一点。但是&#xff0c;现在还有很多朋友一直在问这个是怎么装系统的&#xff0c;关键是装系统耗的时间比较长&#xff0c;步骤好像很复杂的样子&#xff0c;担心自己操作出现失误。确实&am…

Ansys Zemax | 如何以数据的方式定义网格矢高表面

引言 本文示范了如何输入表面起伏数据&#xff0c;以定义Zemax OpticStudio中的网格矢高 (Grid Sag) 类型表面&#xff0c;表面起伏数据应为Z坐标轴上的矢高 (Sag)。(联系我们获取文章附件) 正文 表面起伏数据格式是这样定义的&#xff1a; 第一行&#xff0c;由7个数字表示。 …

ASEMI代理英飞凌TDK5100F射频模块的性能与应用分析

编辑-Z 本文将对TDK5100F射频模块进行详细的介绍与分析&#xff0c;包括其性能特点、应用领域、使用方法。通过对这三个方面的阐述&#xff0c;希望能够帮助读者更好地了解TDK5100F射频模块的优势和应用场景。 1、TDK5100F射频模块的性能特点 TDK5100F射频模块是一款高性能的…

IPV6地址基础

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议。其地址数量号称可以为全世界的每一粒沙子编上一个地址 1. ipv6地址表示方法 IPv6的…