算法讲解之字符串

前言:

本文主要讲解算法中和字符串结合的题目,跟字符串结合的算法题种类丰富,主要是跟别的算法结合,下面介绍几道比较经典的题目~

第一道:14. 最长公共前缀

题目描述:

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

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

示例 1:

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

题目解析:

我们就以第一个字符串为基准值,然后以第一个字符串的每一个字符与剩下的全部字符串进行比较,直到不相等,break跳出循环即可,注意返回值我们可以用substr来返回,不用再新创建一个字符串存储。

原码:

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {for(int i = 0;i<strs[0].size();i++){char tmp = strs[0][i];//取一个基准值与剩下比较for(int j = 1;j<strs.size();j++){if(i == strs[j].size() || strs[j][i] != tmp)return strs[0].substr(0,i);//以基准字符串返回  }}return strs[0];}
};

第二题:

5. 最长回文子串

题目描述:

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

如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。

示例 1:

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

题目解析:

我们可以用回文字符串的特性来解决这道题,先确定一个中心坐标,然后分别向左右两边扩张,一直到左右指针的字符不一样就停止。这里的从中心向两边遍历的方法需要考虑两种情况——偶数和奇数。

同样,返回值也可以用substr进行原来字符串截取进行返回。

原码:

class Solution {
public:string longestPalindrome(string s) {//中心扩展算法int num = s.size();//判断特殊情况if(num == 1 || num == 0) return s;int index = 0;int max_len = 0;for(int i = 0;i<num;i++)//依次枚举所有中点{//奇数int left = i-1,right = i+1;while(left >= 0 && right < num){if(s[left] == s[right]){if(right-left+1 > max_len){max_len = right-left+1;index = left;}left--;right++; }else break;}//偶数left = i;right = i+1;while(left >= 0 && right < num){if(s[left] == s[right]){if(right-left+1 > max_len){max_len = right-left+1;index = left;}left--;right++;}else break;}}if(max_len == 0) return s.substr(0,1);return s.substr(index,max_len);}
};

第三题:67. 二进制求和

题目描述:

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

示例 1:

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

示例 2:

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

题目解析:

这题就是标准的高精度算法,本质就是一道模拟题,对小学学过的列竖式运算的模拟

这题要熟练使用如何将字符转换为数字(- '0'),将数字转换为字符(+'0')。

注意reverse逆置函数是C++中已经实现的函数,与swap函数一样。

原码:

class Solution {
public:string addBinary(string a, string b) { int num1 = a.size();int num2 = b.size();string s;int index = 0;//记录下标int bit = 0;//记录进位for(int i = num1-1,j = num2-1;i > -1 || j > -1 || bit;i--,j--)//注意循环判断条件{int tmp = 0; if(i > -1) tmp += a[i]-'0';if(j > -1) tmp += b[j]-'0';tmp += bit;s += tmp%2 + '0';//再将数字转换为字符bit = tmp/2;}reverse(s.begin(),s.end());return s;}
};

第四题:43. 字符串相乘

题目描述:

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

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

示例 1:

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

示例 2:

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

题目解析:

本题也是一道模拟题,对乘法列竖式运算的模拟,但是如果只是普通的乘法列竖式,未免模拟过于繁琐,因此我们还要了解一种非进位相乘~

这种非进位相乘模拟起来更加简单。无进位相乘然后相加,,最后处理进位。

原码:

class Solution {
public:string multiply(string num1, string num2) {if(num1 == "0" || num2 == "0") return "0";int len1 = num1.size(),len2 = num2.size();vector<int> arr;arr.resize(len1+len2); reverse(num1.begin(),num1.end());reverse(num2.begin(),num2.end());//存储没有进位的答案for(int i = 0;i<len1;i++){int a = num1[i]-'0';for(int j = 0;j<len2;j++){int b = num2[j]-'0';arr[i+j] += a*b;//创建数组记录每一位无进位相乘}}//处理进位string ans;int bit = 0;for(int i = 0;i<len1+len2;i++){arr[i] += bit;ans += arr[i] % 10 + '0';bit = arr[i]/10;}reverse(ans.begin(),ans.end());//处理前导0if(ans[0] == '0'){ans.erase(0,1);}return ans;}
};

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

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

相关文章

使用Vue.js输出一个hello world

导入vue.js <script src"https://cdn.jsdelivr.net/npm/vue2/dist/vue.js"></script> 创建一个标签 <div id"app">{{message}}</div> 接管标签内容&#xff0c;创建vue实例 <script type"text/javascript">va…

掌握Pandas.to_datetime函数:时间序列数据处理的利器【第78篇—Pandas.to_datetime函数】

掌握Pandas.to_datetime函数&#xff1a;时间序列数据处理的利器 在数据处理和分析中&#xff0c;时间序列数据的处理是一个重要的环节。Pandas库中的to_datetime函数为我们提供了一个方便而强大的工具&#xff0c;用于将字符串或数字等格式的日期转换为Pandas中的datetime对象…

一探Lepton Search究竟

2024年1月25日&#xff0c;阿里巴巴原技术副总裁在 Twitter 上称用不到 500 行 Python 代码实现了 AI 对话搜索引擎&#xff0c;并在27日附上了开源地址&#xff1a;https://github.com/leptonai/search_with_lepton&#xff0c;截止春节期间已经5.8K的Star。 Twitter截图 Comm…

three.js 细一万倍教程 从入门到精通(三)

目录 五、详解PBR材质纹理 5.1、详解PBR物理渲染 5.2、标准网格材质与光照物理效果 5.3、置换贴图与顶点细分设置 5.4、设置粗糙度与粗糙度贴图 5.5、设置金属度与金属贴图 5.6、法线贴图应用 5.7、如何获取各种类型纹理贴图 5.8、纹理加载进度情况 单张图片加载 多…

[Java][算法 滑动窗口]Day 02---LeetCode 热题 100---08~09

第一题 无重复字符串的最长子串 思路 其实就是在字符串S中 找到没有重复的最长子串的长度 这道题的难点就是在于如何判断最长并且无重复 首先 最长长度 可以使用变量max记录保存 再者 判断有无重复 最简单的方法就是 暴力遍历法 即对于每次找的子串都再次寻找遍历…

【JAVA WEB】JavaScript--函数 作用域 对象

目录 函数 语法格式 示例 定义没有参数列表&#xff0c;也没有返回值的一个函数 定义一个有参数列表 &#xff0c;有返回值的函数 关于参数个数 函数表达式 作用域 作用域链 对象 基本概念 创建对象 1.使用 字面量 创建对象 2.使用new Object()创建对象 3.使…

SNMP 简单网络管理协议、网络管理

目录 1 网络管理 1.1 网络管理的五大功能 1.2 网络管理的一般模型 1.3 网络管理模型中的主要构件 1.4 被管对象 (Managed Object) 1.5 代理 (agent) 1.6 网络管理协议 1.6.1 简单网络管理协议 SNMP 1.6.2 SNMP 的指导思想 1.6.3 SNMP 的管理站和委托代理 1.6.4 SNMP…

【Zigbee课程设计系列文章】Zigbee开发环境搭建

【Zigbee课程设计系列文章】Zigbee开发环境搭建 前言IAR 下载安装Z-Stack协议栈安装 &#x1f38a;项目专栏&#xff1a;【Zigbee课程设计系列文章】&#xff08;附详细使用教程完整代码原理图完整课设报告&#xff09; 前言 &#x1f451;由于无线传感器网络&#xff08;也即…

C语言——枚举类型

&#x1f4dd;前言&#xff1a; 在之前的文章中我们已经讲解了自定义类型中的结构体类型和联合体类型&#xff0c;现在我们再充分学习一下C语言中的枚举类型&#xff1a; 1&#xff0c;什么是枚举类型 2&#xff0c;枚举类型的定义和变量的声明 3&#xff0c;对变量进行赋值 &a…

[计算机网络]---网络编程套接字

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、基础知识…

Android Graphics 图像显示系统 - 开篇

“ 随着学习的不断深入和工作经验的积累&#xff0c;欲将之前在博客中整理的Android Graphics知识做进一步整理&#xff0c;并纠正一些理解上的错误&#xff0c;故开设Graphics主题系列文章 ” 序言 由于工作需要&#xff0c;也源于个人兴趣&#xff0c;终于下决心花时间整理一…

【前端设计】炫酷导航栏

欢迎来到前端设计专栏&#xff0c;本专栏收藏了一些好看且实用的前端作品&#xff0c;使用简单的html、css语法打造创意有趣的作品&#xff0c;为网站加入更多高级创意的元素。 html <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…