算法通过村第十二关-字符串|黄金笔记|冲刺难题

文章目录

  • 前言
  • 最长公共前缀
    • 纵向比较
    • 横向比较
  • 字符串压缩问题
  • 表示数值的字符串
  • 总结


前言


提示:我有时候在想,我是真的不太需要其他人,还是因为跟他们在一起时没法自己,所以才保持距离。我们的交谈就像是平行而毫无交集的自言自语。我们所分享的可能不过是相互之间的不理解。 --西里尔·佩德罗萨《春分秋分》

我们接着看字符串问题,字符串问题还有很多。

最长公共前缀

参考题目地址:14. 最长公共前缀 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
解答这个问题,首先要就看看公共前缀的分布有什么特点,我们看下下图:

在这里插入图片描述
可以看到,第一种方式,我们可以竖着比较,如左图所示那样,每前进一个位置就比较各个串,看是不是都是相等的,只要在某一轮遇到不相等的,哪么就结束。

第二种方式,我们还可以横着比较,先比较前两个找到公共前缀fix1,然后再和第三个比较找到公共前缀fix2,我们可以确定fix2一定不会比fix1更长,然后在向下比较,直到最后一个fixn,每次得到的fix都不会比前面的长,最后比较完还剩下的就是需要找的前缀了。

看到这里有没有一种似曾相识的感觉,我们在前面合并k个数组或者k个链表不也是类似的思路吗?是的就是这样。

第三种方式,我们可以对第二种做优化,借鉴并归的思想,先两两组找fix,然后找到后在两两并归呢?,当然是可行的,这就是并归的体现。

不过我们先看第一种实现方式,竖着比较,纵向扫描,从前往后遍历所有的字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不同则当前列不再属于公共前缀,当前列之前的部分为最长的公共前缀。

纵向比较

    /*** 纵向比较(最长公共前缀)* @param strs* @return*/public static String longestCommonPrefix1(String[] strs) {// 校验参数if(strs == null || strs.length == 0){return "";}// 获取总串数int count = strs.length;// 获取第一串的长度int len = strs[0].length();// 纵向遍历// 外循环是 第一串的长度for(int i = 0; i < len; i++){// 获取第一个字符char c = strs[0].charAt(i);// 内循环是 纵向比较for(int j = 1; j < count; j++){// 注意这里的条件if (i == strs[j].length() || strs[j].charAt(i) != c){return strs[0].substring(0,i);}}}return strs[0];}

横向比较

第二种是横着一次比较,一次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀(其实就是看是否要缩短,一定不会是长的),当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。如果在尚未遍历完所有字串是,最长公共前缀已经是空串,则最长公共前缀一定是空串,因此也不需要继续遍历剩下的字符串了,直接返回空串即可。

    /*** 方法2 :横向** @param strs* @return*/public String longestCommonPrefix(String[] strs) {if (strs == null || strs.length == 0) {return "";}int count = strs.length;String prefix = strs[0];for(int i = 1; i < count; i++) {prefix = longestCommonPrefix(prefix, strs[i]);if (prefix.length() == 0){break;}}return prefix;}public String longestCommonPrefix(String str1, String str2) {int len = Math.min(str1.length(), str2.length());int index = 0;while(index < len && str1.charAt(index) == str2.charAt(index)) {index++;}return str1.substring(0, index);}

字符串压缩问题

参考题目介绍:443. 压缩字符串 - 力扣(LeetCode)

在这里插入图片描述
在这里插入图片描述
这道题,如果采用双指针的化,可以吗?显然不行,我们深入分析采用三指针。

这个我们可以使用两个指针分别标志我们在字符串中读和写的位置,还有一个指针left用来标记重复字段的开始位置。read指针不断的向前读取,每次读到指针read移动到某一段连续相同字串的最右侧,我们就在写指针write处一次写入该子串对应的字符和子串长度即可。

当读指针read位于字符串的末尾,或读指针read指向字符不同于下一个字符时,我们就认为读指针read位于某一段连续相同子串的最右侧。该子串对应的字符即为读指针read指向的字符串。我们使用left来记录该字串的最左侧的位置,这样字串长度即为read - left + 1。

这里还有一个问题,就是藏毒可能超过10,因此还要实现将数字转化为字符串写入到原来字符串的功能。这里我们可以采用短除法将字串长度倒叙写入原子符串中,然后再将其反转即可。

    /*** 压缩字符串(三指针)* @param chars* @return*/public static int compress(char[] chars) {// 校验参数if (chars == null || chars.length == 0){return 0;}// 创建指针域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;while(num > 0){chars[write++] = (char)(num % 10 + '0');num /= 10;}// 这里需要反转一下数字(大于10 的情况) 01  10reverse(chars,anchor,write - 1);}// 更新左边界left = read + 1;}}return write;}public static void reverse(char[] chars, int left, int right) {while (left < right){char ch = chars[left];chars[left] = chars[right];chars[right] = ch;left++;right--;}}

表示数值的字符串

参考题目地址:LCR 138. 有效数字 - 力扣(LeetCode)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
推荐做一下这个题目,不是难就是麻烦。这里留个作业:


总结

提示:字符串难度冲刺;最长前缀处理;字符串压缩处理;三指针问题解决;字符串表示数值问题:


如果有帮助到你,请给题解点个赞和收藏,让更多的人看到 ~ ("▔□▔)/

如有不理解的地方,欢迎你在评论区给我留言,我都会逐一回复 ~

也欢迎你 关注我 ,喜欢交朋友,喜欢一起探讨问题。
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python—Scrapy实践项目

爬取豆瓣电影2022年Top250部经典电影 1.项目概述 从https://movie.douban/top250爬取电影的标题、评分、主题。我在之前使用普通的爬虫实现了类似的功能&#xff0c;可以对比来进行学习&#xff08;Python爬虫——爬虫基础模块和类库&#xff08;附实践项目&#xff09;&#…

矩阵的相似性度量的常用方法

矩阵的相似性度量的常用方法 1&#xff0c;欧氏距离 欧式距离是最易于理解的一种距离计算方法&#xff0c;源自欧式空间中两点间的距离公式。 (1)二维平面上的点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1​,y1​)和点 b ( x 2 , y 2 ) b(x_2,y_2) b(x2​,y2​)的欧式距离为 d ( x …

【网络】抓包工具Wireshark下载安装和基本使用教程

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

javaee ssm框架项目整合thymeleaf2.0 更多thymeleaf标签用法 项目结构图

创建ssmthymeleaf项目 创建ssmthymeleaf项目参考此文 thymeleaf更多常用标签 <!DOCTYPE html> <html lang"en" xmlns:th"http://www.thymeleaf.org"> <head><meta charset"UTF-8"><title>Title</title> …

怎么压缩ppt文件?

怎么压缩ppt文件&#xff1f;造成ppt文件体积太大的原因主要有两个&#xff1a;① 图片和媒体文件&#xff0c;PPT中使用高分辨率、大尺寸的图片或视频文件会增加文件大小。如果未经压缩或优化&#xff0c;这些文件可能会占用较大的存储空间&#xff1b;② 动画和特效&#xff…

Super-jacoco应用统计代码覆盖率及问题处理

一、原文地址 滴滴开源Super-jacoco&#xff1a;java代码覆盖率收集平台 - 掘金 二、背景 我要使用Super-jacoco&#xff0c;对手工测试&#xff0c;进行代码覆盖率的统计。 为什么使用Super-jacoco&#xff0c;而不是直接使用jacoco&#xff0c;因为Super-jacoco解决了增量…

STC89C51基础及项目第13天:小车go、软件调速

1. 小车散件组装_推荐相同接线&#xff08;259.104&#xff09; 2. L9110s电机控制器接线&#xff08;260.105&#xff09; L9110s电机模块开发 接通VCC&#xff0c;GND 模块电源指示灯亮&#xff0c; 以下资料来源官方&#xff0c;但是不对&#xff0c;根据下节课实际调试 …

WPF向Avalonia迁移(一、一些通用迁移项目)

通用变更 WPF&#xff1a;Visibility 其他参考文档 WPF&#xff1a; <TextBlock Visibility"Visible"/><TextBlock Visibility"Collapsed"/><TextBlock Visibility"Hidden"/>Avalonia &#xff1a; <TextBlock IsVisib…

POI 和 EasyExcel 操作 Excel

一、概述 目前操作 Excel 比较流行的就是 Apache POI 和阿里巴巴的 easyExcel。 1.1 POI 简介 Apache POI 是用 Java 编写的免费开源的跨平台的 Java API&#xff0c;Apache POI 提供 API 给 Java 程序对 Microsoft Office 格式文档读和写的常用功能。POI 为 “Poor Obfuscati…

20231008工作心得:sql

1.SQL语句里的if的嵌套使用 if(product A and brand_name B,C,if(product A and brand_name !B,D,product)) as product if&#xff08;A,B,C&#xff09;。SQL里if函数&#xff0c;如果条件A成立&#xff0c;就显示B的值&#xff0c;否则就显示C。 这个代码的意思的&#x…

RabbitMQ 介绍与 SpringBootAMQP使用

一、MQ概述 异步通信的优点&#xff1a; 耦合度低吞吐量提升故障隔离流量削峰 异步通信的缺点&#xff1a; 依赖于Broker的可靠性、安全性、吞吐能力架构复杂&#xff0c;业务么有明显的流程线&#xff0c;不方便追踪管理 什么是的MQ MQ&#xff08;Message Queue&#xf…

ARM-day5作业

.text .global _start _start: 1、设置GPIOE、GPIOF寄存器的时钟使能 RCC_MP_AHB4ENSETR[4]->1 0x50000a28 LDR R0,0x50000a28 LDR R1,[R0] ORR R1,R1,#(0x3<<4) STR R1,[R0]2、设置PE10、PF10、PE8管脚为输出模式 GPIOE_MODER[21:20]->01 0x50006000…

Flask与PyQt结合使用时候,阻塞,界面卡死

一.问题起因 做了个服务端, 使用到了python的PYQT6和Flask, PYQT做的是个简单的设置界面: 但是在点击开始运行, 写入flask run的代码的时候, PYQT界面卡死了 代码如下: # 生产环境模式server make_server(0.0.0.0, ser_port, app)server.serve_forever()app.run() 二.问题产…

【Python】WebUI自动化—如何用Selenium IDE录制脚本生成单元测试代码(基于Chrome)(17)

一.Selenium IDE介绍 Selenium IDE是Chrome和FireFox浏览器中的插件&#xff0c;Selenium IDE结合浏览器提供脚本录制、脚本回放、脚本编辑、元素定位等功能&#xff0c;使用Selenium IDE可以将录制的脚本生成相应单元测试框架的自动化测试脚本&#xff0c;录制脚本支持导出Py…

Meta分析的流程及方法

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

【数据结构】栈和队列-- OJ

目录 一 用队列实现栈 二 用栈实现队列 三 设计循环队列 四 有效的括号 一 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; typedef int QDataType; typedef struct QueueNode {struct QueueNode* next;QDataType data; }QNode;typedef struct …

使用docker搭建nacos单机、集群 + mysql

单机搭建 1 拉取mysql镜像 docker pull mysql:5.7.40 2 启动mysql容器 docker run -d --namemysql-server -p 3306:3306 -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD123456 mysql:5.7.40 3 执行nacos的数据库脚本 /* * Copyright 1999-2018 Alibaba Group Holding L…

ctfshow web入门 php特性 web136-web140

1.web136 还有一种写文件的命令时tee命令 payload&#xff1a; : ls /|tee 1 访问1下载查看文件1发现根目录下有flag cat /f149_15_h3r3|tee 2 访问下载查看文件22.web137 call_user_func <?php class myclass {static function say_hello(){echo "He…

Graphviz 作图工具

选择 Graphviz 作为作图工具&#xff0c;主要是想通过代码创建图标&#xff0c;按照 Graphviz 的代码规范就可以生成 svg 的图片。当然&#xff0c;这样的工具也有很多&#xff0c;有些 markdown 编辑器也做了集成&#xff0c;比如&#xff1a; flowchart.jsMermaid 了解 Gra…

打印字节流和字符流

打印字节流和字符流 printStream/ printWriter的构造器和方法都是一样的 package printfile;import java.io.FileOutputStream; import java.io.OutputStream; import java.io.PrintStream; import java.io.PrintWriter; import java.nio.charset.Charset;public class Prin…