14.3:给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果

news2024/11/23 16:29:31

给定一个由字符串组成的数组strs,必须把所有的字符串拼接起来,返回所有可能的拼接结果中字典序最小的结果

贪心写法

首先注意的一点是:如果两个字符串的长度相同,“abc”,“abd”,肯定是“abc”的字典序最小,放在前面。拼接的结果是abcabd也是最小的,

当两个字符串的长度不相同时“b”,“bac”,计算机进行字典序比较的时候,会将“b”后面补上最小的ASCII,即变成 “b00” 与 “bac” 进行比较。此时“b”小放前面,此时拼接的结果是:bbac,但是bbac > bacb所以这样拼接有问题。所以需要写一个我们自己的比较器。

思路:
1:将字符串数组进行排序,排序的标准就是我们自己写的比较器(两个字符串进行拼接,拼接结果小的字符串放前面);

注意这个地方要有传递性才可以,比如说:( 1<10 && 10 < 20 ) --> (1 < 20) , 同理: (ab < abc && abc < abcg) --> ab < abcg

只有具有传递性,这个数组的排序才是有效的。至于传递性的证明,不需要自己证,写一个对数器,用实验的方法来证明自己的假设。

2:遍历整个数组,将数组中的结果拼接起来。

3:返回这个结果。

//贪心写法
    public static String lowestString2(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        Arrays.sort(strs, new MyComparator());
        String ans = strs[0];
        for (int i = 1; i < strs.length; i++) {
            ans = ans.concat(strs[i]);
        }
        return ans;
    }

    public static class MyComparator implements Comparator<String> {
        @Override
        public int compare(String o1, String o2) {
            // compareTo方法是用来比较两个字符串的字典顺序。-----------------------------**--
            // 如果返回值小于0,则表示(o1 + o2)小于(o2 + o1),
            // 如果返回值等于0,则表示两者相等,
            // 如果返回值大于0,则表示(o1 + o2)大于(o2 + o1)。
            return (o1 + o2).compareTo(o2 + o1);
        }
    }

暴力写法

思路:总思路就是:给我一个字符串数组,将所有可能的情况给串起来,然后返回字典序最小的拼接情况。

我们需要一个容器来存放所有可能的结果:这个容器可以用TressSet,因为对于字符串他会自动的按字典序进行由小到大的排序

如何求得所有的可能情况

		for (int index = 0; index < strs.length; index++) {
            String first = strs[index];//每一个字符串作为头的情况。
            String[] nexts = removeIndex(strs, index); //除去头以后剩下的字符串组成的数组。
            TreeSet<String> next = process(nexts); //通过递归调用,返回的是一个容器,里面存褚着所有的除去头以外的字符串。
            for (String cur : next) { // 将头节点都给安上。
                ans.add(first.concat(cur));
            }
        }

在这里插入图片描述

//暴力写法
    // lowestString1 : 返回所有可能的拼接结果中字典序最小的结果
    public static String lowestString1(String[] strs) {
        if (strs == null || strs.length == 0) {
            return "";
        }
        TreeSet<String> set = process(strs);
        return set == null || set.size() == 0 ? "" : set.first();
    }

    // process : strs中所有字符串的可能情况全排列,返回所有可能情况。
    public static TreeSet<String> process(String[] strs) {
        TreeSet<String> ans = new TreeSet<>();
        if (strs == null || strs.length == 0) {
            ans.add("");
            return ans;
        }
        for (int index = 0; index < strs.length; index++) {
            String first = strs[index];
            String[] nexts = removeIndex(strs, index);
            TreeSet<String> next = process(nexts);
            for (String cur : next) {
                ans.add(first.concat(cur));
            }
        }
        return ans;
    }

    public static String[] removeIndex(String[] strs, int index) {
        String[] ans = new String[strs.length - 1];
        int ansIndex = 0;
        for (int i = 0; i < strs.length; i++) {
            if (i != index) {
                ans[ansIndex++] = strs[i];
            }
        }
        return ans;
    }

比较器

做贪心的题目比较器是很重要的,因为为了避免证明,我们需要通过实验的方法来验证我们的答案。

// -------------------------------- for test -------------------------------

    public static void main(String[] args) {
        int testTime = 10000;
        int strArrayLength = 5;
        int strLength = 5;
        System.out.println("test begin");
        for (int i = 0; i < testTime; i++) {
            String[] arr1 = generateRandomStringArray(strArrayLength, strLength);
            String[] arr2 = copyStringArray(arr1);
            if (!lowestString1(arr1).equals(lowestString2(arr2))) {
                System.out.println(arr1);
                System.out.println(arr2);
                System.out.println("ooops");
            }
        }
        System.out.println("finish");
    }

    public static String[] generateRandomStringArray(int strArrayLength, int strLength) {
        String[] string = new String[(int) (Math.random() * strArrayLength + 1)];
        for (int i = 0; i < string.length; i++) {
            char[] c = new char[(int) (Math.random() * strLength + 1)];
            int a = (int) (Math.random() * 26); //[0,25]
            for (int j = 0; j < c.length; j++) {
                c[j] = (Math.random() < 0.5 ? (char) (65 + a) : (char) (95 + a));
            }
            string[i] = c.toString();
        }
        return string;
    }

    public static String[] copyStringArray(String[] ans) {
        String[] ret = new String[ans.length];
        for (int i = 0; i < ans.length; i++) {
            ret[i] = ans[i];
        }
        return ret;
    }
}

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

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

相关文章

15.2:分金条的最小代价

一块金条切成两半&#xff0c;是需要花费和长度数值一样的铜板 比如长度为20的金条&#xff0c;不管怎么切都要花费20个铜板&#xff0c;一群人想整分整块金条&#xff0c;怎么分最省铜板? 例如&#xff0c;给定数组{10,20,30}&#xff0c;代表一共三个人&#xff0c;整块金条…

情绪管理ABC法

情绪管理ABC法 是由著名心理学家艾利斯&#xff08;Albert Ellis&#xff09;提出的一种情绪管理方法。 模型介绍 情绪&#xff0c;不取决于发生的事实&#xff0c;取决于我们如何看待这件事ABC理论认为&#xff0c;我们的情绪©&#xff0c;其实与发生的事件(A)无关&…

亚马逊云科技赋能敦煌网集团上云,云上新架构带来价值

敦煌网成立于2004年&#xff0c;是领先的B2B跨境电子商务交易平台&#xff0c;敦煌网在品牌优势、技术优势、运营优势、用户优势四大维度上&#xff0c;已建立起竞争优势。随着跨境电商的日趋成熟&#xff0c;经营范围持续扩大、品类和渠道的增加&#xff0c;以及AIGC等行业新技…

Java程序猿搬砖笔记(十三)

文章目录 MySQL数据库生成自动增长序号MySQL修改密码SpringBoot定时任务解决Mybatis出现的各种Parameter not found. Available parameters are [ , ]Mybatis的foreach标签遍历mapSpringBoot项目打包SpringBoot Async使用注意事项Spring Cloud Config bootstrap文件&#xff…

内蒙古自治区出台加快充换电基础设施建设实施方案

摘要&#xff1a;为深入贯彻落实《国务院办公厅关于印发新能源汽车产业发展规划&#xff08;2021—2035年&#xff09;的通知》&#xff08;国办发 ﹝2020﹞39号&#xff09;、《国家发展改革委等部门关于进一步提升电动汽车充电基础设施服务保障能力的实施意见》&#xff08;发…

杭州久斗贸易有限公司官网上线 | LTD酒水行业案例分享

​一、公司介绍 杭州久斗贸易有限公司是集现代化电子商务与传统销售网络于一体的新兴企业。成立于2022年12月&#xff0c;是杭州地区一家专业的酒类销售贸易公司。 公司股东及经营者拥有二十年以上国内名酒销售经验&#xff0c;目前主营茅台.五粮液等高端白酒批发业务&am…

halcon matlab 中pose matrix之间的转换

pose_to_hom_mat3d (TransPose, HomMat3D) 原理&#xff1a; matlab 验证&#xff1a; function [a,b]getMatrix(pose) syms x y z; xdeg2rad(pose(4)); ydeg2rad(pose(5)); zdeg2rad(pose(6)); mat_x[1 0 0 0;0 cos(x) -sin(x) 0;0 sin(x) cos(x) 0; 0 0 0 1]; mat_…

Object.defineProperty到底有啥用

Object.defineProperty Object.defineproperty 的作用就是直接在一个对象上定义一个新属性&#xff0c;或者修改一个已经存在的属性 使用Object.defineProperty之前 number和person之间并无关联 使用Object.defineProperty之后 person和number之间有了关联&#xff1b;修…

1164 Good in C(38行代码+超详细注释)

分数 20 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 When your interviewer asks you to write "Hello World" using C, can you do as the following figure shows? Input Specification: Each input file contains one test case. For each case, the …

Ceph 分布式存储

Ceph概述 存储基础 单机存储设备 ●DAS&#xff08;直接附加存储&#xff0c;是直接接到计算机的主板总线上去的存储&#xff09; IDE、SATA、SCSI、SAS、USB 接口的磁盘 所谓接口就是一种存储设备驱动下的磁盘设备&#xff0c;提供块级别的存储 ●NAS&#xff08;网络附加存…

jwt----介绍,原理

token&#xff1a;服务的生成的加密字符串&#xff0c;如果存在客户端浏览器上&#xff0c;就叫cookie -三部分&#xff1a;头&#xff0c;荷载&#xff0c;签名 -签发&#xff1a;登录成功&#xff0c;签发 -认证&#xff1a;认证类中认证 # jwt&…

火伞云全球节点分布国家及城市列表

火伞云融合CDN划分为中国境内和中国境外两个服务区域。 中国境内区域为中国大陆全地区统一计费&#xff08;不含港澳台&#xff09;&#xff0c;全球用户访问均会调度至中国内地加速节点进行服务。 中国境外区域&#xff0c;按CDN 节点服务器所在地区&#xff0c;划分为北美地…

uni-app使用echarts绘制数据可视化图

先打开项目 然后选择 使用命令行窗口打开所在目录(U) 在弹出的终端中输入指令来引入依赖 npm install echarts然后 我们 打开echarts的官网 点击这里这个 示例 找一个自己喜欢的案例点进去 我这里就用一个最简单的吧 代码看着不会乱 将他这个 option中的内容复制出来 然后…

重塑未来:科技创新驱动社会变革

科技创新驱动社会变革 前言正文一、人工智能&#xff08;AI&#xff09;&#xff1a;智能技术的崛起二、区块链技术&#xff1a;去中心化的数字经济三、量子计算&#xff1a;开启未来的大门四、生物技术&#xff1a;拓展医学与农业的边界 总结 前言 近年来&#xff0c;科技领域…

Python开发工具PyCharm入门指南 - 如何创建密码短语生成器(下)

PyCharm是一种Python IDE&#xff0c;其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0c;该IDE提供了一些高级功能&#xff0c;以用于Django框架下的专业Web开发。 PyCharm 最新版下载 在上篇文章中&#xff0c;我们学习了密码短语、密码短语…

统信UOS系统开发笔记(二):国产统信UOS系统搭建Qt开发环境安装Qt5.12

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/130984263 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

得物人事系统时间轴设计的演化历程

1 什么是时间轴 ~&#xff08;以上图片出自电影《星际穿越》&#xff09;~ 如果你看过《星际穿越》&#xff0c;应该对这一幕印象深刻&#xff0c;女儿墨菲所处的房间&#xff0c;按照时间分为了无数个三维空间实体。三维空间加时间组合成四维空间&#xff0c;即时空。 时间轴…

奇怪,能ping通怎么还是上不了网?

我的网工朋友大家好啊 一般如果遇到没法上网的问题&#xff0c;你会怎么办。 可能会尝试去使用ping命令来测试一下网络是不是正常&#xff0c;对吧&#xff1f; 但是有时候会出现&#xff0c;ip能ping通&#xff0c;但是就是无法上网&#xff0c;应该大部分网工都遇到过这种…

虚实连接:惯性动作捕捉系统系列产品多领域广泛应用

近年来&#xff0c;将人体数字化融入虚拟世界已经成为一股浪潮&#xff0c;特别聚焦于姿态动作捕捉和人体运动学分析。此时建立准确的虚拟与现实数字模型&#xff0c;并研究运动参数和力学参数的关联至关重要。同时可推动虚拟现实和人机交互的发展&#xff0c;拓展医疗康复、体…