算法通关村十二关 | 字符串前缀问题

news2024/11/25 7:12:58

1. 最长公共前缀

题目:LeetCode14,14. 最长公共前缀 - 力扣(LeetCode)

 思路一

我们先看公共前缀有什么特点。

第一种方式,竖着比较,如图左边所示,选取数组中第一个字符串的位置,每前进一个就比较各个字符串,看是否相等,只有某一轮遇到不相等,则结束返回结果。

代码一

    public String longestCommonPrefix(String[] strs){
        //1.为空的情况
        if (strs == null || strs.length == 0){
            return "";
        }
        //2.先竖向比较,再横向比较
        //第一个元素的长度
        int length = strs[0].length();
        //数组中元素的个数
        int count = strs.length;
        for (int i = 0; i < length; i++) {
            char c = strs[0].charAt(i);
            for (int j = 0; j < count; j++) {
                if ( i == strs[j].length() || strs[j].charAt(i) != c){
                    return strs[0].substring(0,1);
                }
            }
        }
        return strs[0];
    }

思路二

还是这张图

        如图右边,我们可以横着比较,先比较前两个找到公共前缀fix1,然后再和第三个比较找到公共前缀fix2,我们可以确定fix2一定不会比fix1更长,然后再和第四个比较,每次都会更新fix再和下个元素比较,依次类推,直到最后一个元素比较完。

如果未遍历完的时候最长公共前缀已经是空串,则直接结束返回空串。

代码二

    public String longget(String[] strs){
        //1.为空的情况
        if (strs == null || strs.length == 0){
            return "";
        }
        //2.先横向比较,再竖向比较
        String prefix = strs[0];
        int count = strs.length;
        for (int i = 0; i < count; i++) {
            prefix = longget2(prefix, strs[i]);
            if (prefix.length() == 0){
                break;
            }
        }
        return prefix;
    }
    //当前最长公共前缀,与下个元素比较,
    public String longget2(String str1,String str2){
        int length = Math.min(str1.length(),str2.length());
        int index = 0;
        while (index < length && str1.charAt(index) == str2.charAt(index)){
            index++;
        }
        return str1.substring(0,index);
    }

拓展

        可以对第二种方式进行优化,借鉴归并思想,先两两一组找fix。然后再将找到的fix两两归并。归并之前有文章提到过。

http://t.csdn.cn/bzzBJ归并排序。

2. 字符串压缩问题

题目LeetCode443:443. 压缩字符串 - 力扣(LeetCode)

 思路

用三指针来解决问题

        使用两指针分别标志我们在字符串中的读和写的位置,还要用left指针来标记重复字段的开始位置,便于获取重复字段的长度。read不断向前读取,每次当read指针移动到某一段连续相同字符串的右侧,我们就在写指针write依次写入孩子串对应的字符和字符串长度。

        当read指针位于末尾的时候,或读指针read指向的字符不同于下一个字符的时候,我们就认为读指针,位于某一段重复字段的右侧,该字串的字符就是read指针对应指向的字符串。长度:left记录重复字段的最左侧的位置,则字符串长度为read-left+1。

其中如果出现超过10的重复字段需要特殊处理,代码中有注释解释。

代码

    public int compress(char[] chars){
        int n = chars.length;
        int write = 0,left = 0;
        for (int read = 0; read < n; read++) {
            if (read == n - 1 || chars[read] != chars[read + 1]) {
                chars[write++] = chars[read];
                int num = read - left + 1;
                if (num >1){
                    int anchor = write;
                    //+'0'是将十进制转为char型,这里如果超过10,先拼接个位再拼接十位
                    while (num > 0){
                        chars[write++] = (char) (num % 10 + '0');
                        num /= 10;
                    }
                    reverse(chars,anchor,write - 1);
                }
                //每出现一新的字符,left指向开头
                left = read + 1;
            }
        }
        return write;
    }
    public void reverse(char[] chars, int left, int right){
        while (left < right){
            char temp = chars[left];
            chars[left] = chars[right];
            chars[right] = temp;
            left++;
            right--;
        }
    }

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

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

相关文章

platform相关资料

Step 1: Hardware Settings for Vitis Platform — Vitis™ Tutorials 2021.2 documentationhttps://xilinx.github.io/Vitis-Tutorials/2021-2/build/html/docs/Vitis_Platform_Creation/Introduction/03_Edge_VCK190/step1.html https://www.cnblogs.com/VagueCheung/p/1313…

Tensoeboard的一些坑与技巧

安装 pip install tensorboard 安装过程中遇到tensoeboard.exe找不到&#xff0c;参考解决&#xff1a; https://blog.csdn.net/weixin_44532467/article/details/123525891 3.启动tensorboard 默认路径 &#xff08;&#xff09; tensorboard --logdir logstensorboard -…

淘宝API技术解析,实现获得淘宝APP商品详情原数据

淘宝API&#xff08;Application Programming Interface&#xff09;是为开发者提供的一组接口&#xff0c;用于与淘宝平台进行数据交互。通过使用淘宝API&#xff0c;开发者可以获得淘宝平台上商品、店铺、订单等各种数据&#xff0c;并进行相应的业务操作。 要实现获取淘宝A…

利用Kettle进行SQLServer与Oracle之间的数据迁移实践

待更新 https://it.cha138.com/tech/show-1275283.html

基于spring boot校园疫情信息管理系统/疫情管理系统

摘要 随着计算机技术&#xff0c;网络技术的迅猛发展&#xff0c;Internet 的不断普及&#xff0c;网络在各个领域里发挥了越来越重要的作用。特别是随着近年人民生活水平不断提高&#xff0c;校园疫情信息管理系统给学校带来了更大的帮助。 由于当前疫情防控形势复杂&#xff…

史上最全软件测试入门到精通【测试+测开】

测试学习大纲梳理 根据本人过往学习经验与理解&#xff0c;整理了一些关于测试学习内容与顺序&#xff0c;涵盖了基本软件测试工程师需要掌握的所有技能&#xff0c;希望可以给想了解的小伙伴们一些指引与帮助&#xff0c;有错误或需求的欢迎留言指出~ 一、web开发者模式 这…

[LeetCode周赛复盘] 第 359 场周赛20230820

[LeetCode周赛复盘] 第 359 场周赛20230820 一、本周周赛总结2828. 判别首字母缩略词1. 题目描述2. 思路分析3. 代码实现 2829. k-avoiding 数组的最小总和1. 题目描述2. 思路分析3. 代码实现 2830. 销售利润最大化1. 题目描述2. 思路分析3. 代码实现 2831. 找出最长等值子数组…

【智算中心】国产GPU横向对比

近日&#xff0c;沐曦发布了一篇名为《沐曦与智谱AI完成兼容性测试 共建软硬件一体化解决方案》的公众号&#xff0c;表示曦云C500千亿参数AI大模型训练及通用计算GPU与智谱AI开源的中英双语对话语言模型ChatGLM2-6B完成适配。测试结果显示&#xff0c;曦云C500在智谱AI的升级版…

V4L2+单色USB摄像头编程实践3:读取MJPG格式图像

查看摄像头支持的MJPG格式的分辨率和帧率&#xff1a; $ v4l2-ctl --list-formats-ext --device /dev/video0 ioctl: VIDIOC_ENUM_FMTType: Video Capture[0]: MJPG (Motion-JPEG, compressed)Size: Discrete 1280x720 Interval: Discrete 0.008s (120.000 fps)Interval:…

敏捷研发管理软件及敏捷管理流程

Scrum中非常强调公开、透明、直接有效的沟通&#xff0c;这也是“可视化的管理工具”在敏捷开发中如此重要的原因之一。通过“可视化的管理工具”让所有人直观的看到需求&#xff0c;故事&#xff0c;任务之间的流转状态&#xff0c;可以使团队成员更加快速适应敏捷开发流程。 …

Java cc链2 分析

环境 cc4 <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-collections4 --> <dependency><groupId>org.apache.commons</groupId><artifactId>commons-collections4</artifactId><version>4.0</version&…

损失函数介绍

用softmax&#xff0c;就可以将一个输出值转换到概率取值的一个范围。 交叉熵损失CrossEntropyLoss 第一个参数weight&#xff0c; 各类别的loss设置权值&#xff0c; 如果类别不均衡的时候这个参数很有必要了&#xff0c;加了之后损失函数变成这样&#xff1a; 第二个参数ign…

8年测试经验之谈 —— 什么是全链路压测?

随着互联网技术的发展和普及&#xff0c;越来越多的互联网公司开始重视性能压测&#xff0c;并将其纳入软件开发和测试的流程中。 阿里巴巴在2014 年双11 大促活动保障背景下提出了全链路压测技术&#xff0c;能更好的保障系统可用性和稳定性。 什么是全链路压测&#xff1f; …

湘潭大学 湘大 XTU 1251 Colombian Number 题解(非常详细)

参考文章 1.XTUOJ-1251-Colombian Number 链接 1251 题面 题目描述 对于正整数n,不存在整数k,使得n等于k加上k的数码累加和&#xff0c;我们称这样的数是哥伦比亚数或者自我数。 比如 11就不是一个哥伦比亚数&#xff0c;因为10加上10的数码累加和1等于11;而20则是一个哥伦…

uniapp 开发微信小程序使用echart的dataZoom属性缩放功能不生效!bug记录!

在本项目中使用的是这个echart库 在项目中添加了dataZoom配置项但是不生效&#xff0c;突然想到微信小程序代码大小的限制&#xff0c;之前的echarts.js是定制的&#xff0c;有可能没有加dataZoom组件。故重新定制echarts.js。之前用的echarts版本是5.0.0&#xff0c;这次也是…

容灾设备系统组成,容灾备份系统组成包括哪些

随着信息技术的快速发展&#xff0c;企业对数据的需求越来越大&#xff0c;数据已经成为企业的核心财产。但是&#xff0c;数据安全性和完整性面临巨大挑战。在这种环境下&#xff0c;容灾备份系统应运而生&#xff0c;成为保证企业数据安全的关键因素。下面我们就详细介绍容灾…

IDEA启动Tomcat两个端口的方式 使用nginx进行反向代理 JMeter测试分布式情况下synchronized锁失效

目录 引出IDEA启动Tomcat两个端口的方式1.编辑配置2.添加新的端口-Dserver.port80833.service里面管理4.启动后进行测试 使用nginx进行反向代理反向代理多个端口运行日志查看启动关闭重启 分布式情况下synchronized失效synchronized锁代码启动tomcat两个端口nginx反向代理JMete…

慕课网 Go工程师 第三周 package和gomodules章节

Go包的引入&#xff1a; 包名前面加匿名&#xff0c;只引入但不使用&#xff0c;如果对应包有init函数&#xff0c;会执行init函数&#xff08;初始化操作&#xff09; 包名前面加. 把这个包的结构体和方法导入当前包&#xff0c;慎用&#xff0c;你不知道当前包和被引入的包用…

顺序表详解|顺序表常见错误并调试分析

前言&#xff1a; 今天我们开始学习基础的数据结构——顺序表&#xff0c;数据结构就是将数据在内存存储起来&#xff0c;在内存管理数据。 一、线性表 1、线性表&#xff08;Linear list&#xff09;是n个具有相同特性的数据元素的有限序列&#xff0c;线性表是一种在实际中广…

美国访问学者签证好办吗?

近年来&#xff0c;随着国际交流与合作的不断深入&#xff0c;许多人对于美国访问学者签证的办理情况产生了浓厚的兴趣。那么&#xff0c;美国访问学者签证到底好办吗&#xff1f;让知识人网小编带您一起了解一下。 首先&#xff0c;美国作为世界上的科研、教育和创新中心之一&…