常见字符串相关题目

找往期文章包括但不限于本期文章中不懂的知识点:

个人主页:我要学编程(ಥ_ಥ)-CSDN博客

所属专栏: 优选算法专题

目录

14.最长公共前缀

5.最长回文子串

67.二进制求和

43.字符串相乘


14.最长公共前缀

题目:

编写一个函数来查找字符串数组中的最长公共前缀。

如果不存在公共前缀,返回空字符串 ""

示例 1:

输入:strs = ["flower","flow","flight"]
输出:"fl"

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 如果非空,则仅由小写英文字母组成

思路:我们有两种方式来查找字符串的最长公共长缀。一种方式是:两两比较,先查找两个字符串的最长公共前缀,得到的结果再去比较后面的字符串,一直比较直至最终遍历完数组即可。另外一种方式是:统一比较,以第一个字符串为基准字符串,从第一个字符字母开始与后续数组元素进行比较,如果遇到了字符串的末尾或者字符串的字母不相等,就可以直接返回最终的结果了。

代码实现:

两两比较的方式:

class Solution {public String longestCommonPrefix(String[] strs) {// 两两比较:比较两个字符串,得到最长公共前缀String ret = strs[0];for (int i = 1; i < strs.length; i++) {String s = strs[i];int j = 0;// 满足两者都不越界的情况while (j < ret.length() && j < s.length()) {if (ret.charAt(j) != s.charAt(j)) { // 不相等直接返回即可break;}j++;}// 更新最长公共前缀ret = ret.substring(0, j);}return ret;}
}

统一比较的方式:

class Solution {public String longestCommonPrefix(String[] strs) {// 统一比较:比较全部字符串的每个字符String ret = strs[0];for (int i = 0; i < ret.length(); i++) {char ch = ret.charAt(i);// 依次比较后面的元素相同位置是否是相同的字符for (int j = 1; j < strs.length; j++) {// 如果到达字符串的末尾了 或者 字符串的字符不相等了,直接返回即可if (i == strs[j].length() || ch != strs[j].charAt(i)) {return ret.substring(0, i);}}}return strs[0]; // 说明所有的元素都是相同的}
}

5.最长回文子串

题目:

给你一个字符串 s,找到 s 中最长的 回文 子串。

示例 1:

输入:s = "babad"
输出:"bab"
解释:"aba" 同样是符合题意的答案。

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

思路:有一个专门寻找回文子串相关的算法:中心扩展算法。因为回文子串的特点是从左到右遍历得到的序列与从右到左得到的序列是一样的,那么从回文子串的中间位置往两边扩展的结果也是一致的。利用这个性质,我们就可以来做题了:遍历字符串,在每一个位置进行中心扩展算法,得到回文子串的序列,最后返回最长的回文子串序列即可。

代码实现:

class Solution {public String longestPalindrome(String ss) {char[] s = ss.toCharArray();int n = s.length;int begin = 0, end = 0;// 固定一个中心点for (int i = 0; i < n; i++) {// 从中心点开始往两侧扩展// 先扩展奇数个int left = i, right = i;while (left >= 0 && right <= n-1 && s[left] == s[right]) {left--;right++;}// 更新begin 与 endif (right-left-1 > end-begin+1) {begin = left+1;end = right-1;}// 再扩展偶数个left = i;right = i+1;while (left >= 0 && right <= n-1 && s[left] == s[right]) {left--;right++;}//更新begin 与 endif (right-left-1 > end-begin+1) {begin = left+1;end = right-1;}}return ss.substring(begin, end+1);}
}

要注意的是在扩展的过程中,字符个数可能是奇数个,也可能是偶数个,因此我们扩展时也得分情况讨论。 

67.二进制求和

题目:

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例 1:

输入:a = "11", b = "1"
输出:"100"

示例 2:

输入:a = "1010", b = "1011"
输出:"10101"

提示:

  • 1 <= a.length, b.length <= 104
  • a 和 b 仅由字符 '0' 或 '1' 组成
  • 字符串如果不是 "0" ,就不含前导零

思路:遍历字符串,拿到两者相加的和,模上进位数作为当前位的结果,当两个字符串遍历完成且进位为0时,就可以返回最终结果了。

代码实现:

class Solution {public String addBinary(String a, String b) {// 遍历字符串模拟列竖式运算int ai = a.length()-1, bi = b.length()-1, t = 0;StringBuilder sb = new StringBuilder();// 注意:题目给的是正序序列,但是计算时需要从后面(低位)开始计算while (ai >= 0 || bi >= 0) {// 先计算两者相同位相加的结果if (ai >= 0) {// t += a.charAt(ai); // 这里拿到的是字符1,而不是数字1t += a.charAt(ai) - '0';}if (bi >= 0) {// t += b.charAt(bi); // 这里拿到的是字符1,而不是数字1t += b.charAt(bi) - '0';}sb.append(t % 2);t /= 2;ai--;bi--;}// 可能最终的进位并不为0if (t != 0) {sb.append(t % 2);}// 注意:最终的结果要逆序return sb.reverse().toString();}
}

43.字符串相乘

题目:

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。

注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。

示例 1:

输入: num1 = "2", num2 = "3"
输出: "6"

示例 2:

输入: num1 = "123", num2 = "456"
输出: "56088"

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1 和 num2 只能由数字组成。
  • num1 和 num2 都不包含任何前导零,除了数字0本身。

思路:与上一题的二进制求和类似。也是采用模拟计算的方式来写,这里是模拟乘法的方式,即列竖式运算。如下所示:

遍历其中一个字符串,使其的每一个字符去乘以另外一个字符串,得到的结果进行相加求和,就是最终的结果。这里的求和就是上面二进制求和的写法。

上面这种暴力模拟是非常麻烦的,代码也是非常多的。还有一种是对乘法的简化:先是无进位相乘,再对结果进行相加,最后转换为正常位数的表示即可。

代码实现:

模拟列竖式运算:

class Solution {// 对两个字符串数字进行相乘,返回字符串形式的积public String multiply(String num1, String num2) {// 判断字符串是否存在0if ("0".equals(num1) || "0".equals(num2)) {return "0";}String ret = "";// 模拟列竖式计算int count = 0; // 统计先导0for (int i = num2.length()-1; i >= 0; i--) {StringBuilder temp = new StringBuilder();// 计算先导0for (int j = 0; j < count; j++) {temp.append(0);}count++;// 计算 num2的每一个位 与 num1 的乘积int product = 0; // 存储乘积int a = num2.charAt(i) - '0';for (int j = num1.length()-1; j >= 0; j--) {int b = num1.charAt(j) - '0';product = a * b + product; // 原始乘积+进位temp.append(product % 10);product /= 10;}// 进位可能不为0if (product != 0) {temp.append(product % 10);}// 将乘积进行相加("两数"之和)ret = twoNumSum(ret, temp.reverse().toString());}return ret;}// 对两个字符串数字进行相加,返回字符串形式的和public String twoNumSum(String s1, String s2) {int i = s1.length()-1, j = s2.length()-1;int sum = 0;StringBuilder builder = new StringBuilder();while (i >= 0 || j >= 0) {if (i >= 0) {sum += s1.charAt(i) - '0';}if (j >= 0) {sum += s2.charAt(j) - '0';}builder.append(sum % 10);sum /= 10;i--;j--;}// 可能存在进位if (sum != 0) {builder.append(sum % 10);}// 需要逆置return builder.reverse().toString();}
}

模拟列竖式优化版:

class Solution {// 对两个字符串数字进行相乘,返回字符串形式的积public String multiply(String num1, String num2) {// 判断字符串是否存在0if ("0".equals(num1) || "0".equals(num2)) {return "0";}// 先逆序字符串String s1 = new StringBuilder(num1).reverse().toString();String s2 = new StringBuilder(num2).reverse().toString();int n1 = s1.length(), n2 = s2.length();// 申请一个数组存放乘积int[] temp = new int[n1+n2-1];// 计算 num2的每一个位 与 num1 的乘积for (int i = 0; i < n2; i++) {int a = s2.charAt(i) - '0';for (int j = 0; j < n1; j++) {int b = s1.charAt(j) - '0';temp[i+j] +=  a*b; // 一定要加上原来的值}}// 将数组的每一位转换成标准表示形式("两数"相加的思路)int i = 0;StringBuilder builder = new StringBuilder();int sum = 0;while (i < n1+n2-1) {sum += temp[i];builder.append(sum % 10);sum /= 10;i++;}// 可能存在进位不为0的情况if (sum != 0) {builder.append(sum % 10);}// 注意要逆置return builder.reverse().toString();}
}

好啦!本期 常见字符串相关题目 的刷题之旅 就到此结束啦!我们下一期再一起学习吧!

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

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

相关文章

Seed Edge- AGI(人工智能通用智能)长期研究计划

Seed Edge 是字节跳动豆包大模型团队推出的 AGI&#xff08;人工智能通用智能&#xff09;长期研究计划12。以下是对它的具体介绍1&#xff1a; 名称含义 “Seed” 即豆包大模型团队名称&#xff0c;“Edge” 代表最前沿的 AGI 探索&#xff0c;整体意味着该项目将在 AGI 领域…

Java定时任务实现方案(四)——Spring Task

Spring Task 这篇笔记&#xff0c;我们要来介绍实现Java定时任务的第四个方案&#xff0c;使用Spring Task&#xff0c;以及该方案的优点和缺点。 ​ Spring Task是Spring框架提供的一个轻量级任务调度框架&#xff0c;用于简化任务调度的开放&#xff0c;通过注解或XML配置的…

(15)基于状态方程的单相自耦变压器建模仿真

1. 引言 2. 单相降压自耦变压器的状态方程 3. 单相降压自耦变压器的simulink仿真模型 4. 实例仿真 5. 总结 1. 引言 自耦变压器的原边和副边之间存在直接的电气连接,所以功率是通过感应和传导从原边转移到副边的,这与双绕组变压器不同,后者的原边和副边是电气隔离的。从…

Highcharts 柱形图:深入解析与最佳实践

Highcharts 柱形图:深入解析与最佳实践 引言 Highcharts 是一个功能强大的图表库,它允许用户轻松地在网页上创建各种类型的图表。其中,柱形图因其直观的展示方式,在数据分析、业务报告等领域得到了广泛应用。本文将深入解析 Highcharts 柱形图,包括其基本用法、高级特性…

【C++基础】多线程并发场景下的同步方法

如果在多线程程序中对全局变量的访问没有进行适当的同步控制&#xff08;例如使用互斥锁、原子变量等&#xff09;&#xff0c;会导致多个线程同时访问和修改全局变量时发生竞态条件&#xff08;race condition&#xff09;。这种竞态条件可能会导致一系列不确定和严重的后果。…

网络安全 | F5-Attack Signatures-Set详解

关注&#xff1a;CodingTechWork 创建和分配攻击签名集 可以通过两种方式创建攻击签名集&#xff1a;使用过滤器或手动选择要包含的签名。  基于过滤器的签名集仅基于在签名过滤器中定义的标准。基于过滤器的签名集的优点在于&#xff0c;可以专注于定义用户感兴趣的攻击签名…

@RestControllerAdvice 的作用

系列博客目录 文章目录 系列博客目录1.ControllerAdvice 有什么用主要功能 2.与 RestControllerAdvice 的区别3.苍穹外卖中的使用4.RestControllerAdvice可以指定范围吗&#xff08;1&#xff09;指定应用到某些包中的 RestController&#xff08;2&#xff09;指定应用到具有特…

代码随想录算法训练营第三十八天-动态规划-完全背包-279.完全平方数

把目标值当作背包容量&#xff0c;每个平方数当作物品&#xff0c;题目变更为装满指定容量的背包&#xff0c;最小用几个物品会不会出现拼凑不出来的情况&#xff1f;不会&#xff0c;因为有数字1&#xff0c;对任意正整数百分百能拼凑出来因此此题目与上一道题就变得一模一样了…

Python帝王學集成-母稿

引用:【【全748集】这绝对是2024最全最细的Python全套教学视频,七天看完编程技术猛涨!别再走弯路了,从零基础小白到Python全栈这一套就够了!-哔哩哔哩】 https://b23.tv/lHPI3XV 语法基础 Python解释器与pycharm编辑器安装 - 定义:Python解释器负责将Python代码转换为计…

springboot 动态配置定时任务

要在Spring Boot中动态配置定时任务&#xff0c;可以使用ScheduledTaskRegistrar类来实现。 首先&#xff0c;创建一个定时任务类&#xff0c;该类需要实现Runnable接口。例如&#xff1a; Component public class MyTask implements Runnable {Overridepublic void run() {/…

LibreChat

文章目录 一、关于 LibreChat✨特点 二、使用LibreChat&#x1fab6;多合一AI对话 一、关于 LibreChat LibreChat 是增强的ChatGPT克隆&#xff1a;Features Agents, Anthropic, AWS, OpenAI, Assistants API, Azure, Groq, o1, GPT-4o, Mistral, OpenRouter, Vertex AI, Gemi…

基础项目实战——3D赛车(c++)

目录 前言一、渲染引擎二、关闭事件三、梯形绘制四、轨道绘制五、边缘绘制六、草坪绘制七、前后移动八、左右移动​九、曲线轨道​十、课山坡轨道​十一、循环轨道​十二、背景展示​十三、引入速度​十四、物品绘制​十五、课数字路障​十六、分数展示​十七、重新生成​十八、…

Python 数据清洗与处理常用方法全解析

在数据处理与分析过程中&#xff0c;缺失值、重复值、异常值等问题是常见的挑战。本文总结了多种数据清洗与处理方法&#xff1a;缺失值处理包括删除缺失值、固定值填充、前后向填充以及删除缺失率高的列&#xff1b;重复值处理通过删除或标记重复项解决数据冗余问题&#xff1…

OpenBMC:编译

1.安装依赖 OpenBMC是基于Yocto搭建的&#xff0c;基于不同的OS预先需要安装的依赖包和工具&#xff0c;清参考&#xff1a; 1 System Requirements — The Yocto Project 5.1.999 documentation 2.下载代码 OpenBMC的源码位于&#xff1a; openbmc/openbmc: OpenBMC Distri…

【C++】设计模式详解:单例模式

文章目录 Ⅰ. 设计一个类&#xff0c;不允许被拷贝Ⅱ. 请设计一个类&#xff0c;只能在堆上创建对象Ⅲ. 请设计一个类&#xff0c;只能在栈上创建对象Ⅳ. 请设计一个类&#xff0c;不能被继承Ⅴ. 请设计一个类&#xff0c;只能创建一个对象&#xff08;单例模式&#xff09;&am…

AAPM:基于大型语言模型代理的资产定价模型,夏普比率提高9.6%

“AAPM: Large Language Model Agent-based Asset Pricing Models” 论文地址&#xff1a;https://arxiv.org/pdf/2409.17266v1 Github地址&#xff1a;https://github.com/chengjunyan1/AAPM 摘要 这篇文章介绍了一种利用LLM代理的资产定价模型&#xff08;AAPM&#xff09;…

《网络数据安全管理条例》施行,企业如何推进未成年人个人信息保护(下)

文章目录 前言三、全流程推进未成年人个人信息保护1、处理前:未成年人个人信息处理的告知同意2、处理中:加强个人信息处理流程管理3、处理后:落实个人信息保护合规审计四、大型网络平台应每年发布社会责任报告前言 《网数条例》颁布前,我国已针对未成年人个人信息保护陆续…

games101-(5/6)

光栅化 投影完成之后&#xff0c;视图区域被确定在从[-1,1]的单位矩阵中&#xff0c;下一步就是光栅化 长宽比&#xff1a;ratio 垂直的可视角度&#xff1a;fild-of-view 可以看到的y 轴的范围&#xff0c;角度越小 越接近正交投影 屏幕坐标系 、 将多边形转化成像素 显示…

01学习预热篇(D6_正式踏入JVM深入学习前的铺垫)

目录 学习前言 一、虚拟机的结构 1. Java虚拟机参数设置 2. java 堆 3. 出入栈 4. 局部变量表 1> 局部变量的剖析 2> 局部变量的回收 5. 操作数栈 1> 常量入栈指令 2> 局部变量值转载到栈中指令 3> 将栈顶值保存到局部变量中指令 6. 帧数据区 7. 栈…

在亚马逊云科技上用Stable Diffusion 3.5 Large生成赛博朋克风图片(下)

背景介绍 在2024年的亚马逊云科技re:Invent大会上提前预告发布的Stable Diffusion 3.5 Large&#xff0c;现在已经在Amazon Bedrock上线了&#xff01;各位开发者们现在可以使用该模型&#xff0c;根据文本提示词文生图生成高质量的图片&#xff0c;并且支持多种图片风格生成&…