当前位置: 首页 > news >正文

【算法】字符串专题

一. (14.) 最长公共前缀

在这里插入图片描述

  • 解法1:两两比较

我们可以先找出前两个的最⻓公共前缀,然后拿这个最⻓公共前缀依次与后⾯的字符串⽐较,这样就可以找出所有字符串的最⻓公共前缀
在这里插入图片描述

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {string ret=strs[0];//以第一个字符串为基础for(int i=1;i<strs.size();i++)//遍历每一个字符串{int j=0;while(j<ret.size()&&j<strs[i].size()&&ret[j]==strs[i][j]) j++;//比较当前字符串与公共部分ret的每一个字符ret=ret.substr(0,j);//更新公共部分,与下一字符数组比较}return ret;}
};
  • 解法2:一同比较

以逐位⽐较这些字符串,哪⼀位出现了不同,就在哪⼀位截⽌。

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {for(int i=0;i<strs[0].size();i++){string ret=strs[0];//记录第一个字符串当作基准for(int j=1;j<strs.size();j++){//当指针超出某一字符串长度,或有一个字符串对应位置不相等就返回if(j==strs.size()||strs[j][i]!=strs[0][i])return ret.substr(0,i);}}return strs[0];//此时证明第一个字符串为所有公共前缀}
};  

二. (5.) 最长回文子串

在这里插入图片描述

  • 算法原理:中心扩散法

回文串的性质,从中心开始左右两边对称位置的数相等,长度为1时自身也构成回文。
可以遍历字符串数组,定义两个指针,从中间往两边扩展,当超出元素有效范围或两指针对应元素不相等时停止,当长度最大时记录起始位置和长度,利用substr切割最长回文串返回

  • 时间复杂度分析:

1.外层循环
遍历字符串中的每个字符(i 从 0 到 n-1),共执行 n 次。
2.内层扩展操作

对于每个 i,代码会进行两次扩展:
一次以 (i, i) 为中心(处理奇长度回文串)
一次以 (i, i+1) 为中心(处理偶长度回文串)
每次扩展操作(while 循环)的本质是向左右两边逐个比较字符,直到不满足回文条件为止。在最坏情况下,每次扩展会遍历几乎整个字符串(例如当字符串本身就是回文串时,如 “aaaaa”),单次扩展的时间复杂度为 O (n)。

  • 暴力枚举法时间复杂度分析

需要两层for循环来判断从每一个字符起始的字符串长度,完后还需要判断该字符串长度是否符合回文串,时间复杂度为n三方

class Solution {
public:string longestPalindrome(string s) {int len=0,start=0;for(int i=0;i<s.size();i++){//先进行奇数长度的判断int left=i,right=i;while(left>=0&&right<s.size()&&s[left]==s[right]) left--,right++;//成为最大长度时更新下标if(right-left-1>len){start=left+1;len=right-left-1;}//偶数长度left=i,right=i+1;while(left>=0&&right<s.size()&&s[left]==s[right]) left--,right++;if(right-left-1>len){start=left+1;len=right-left-1;}}return s.substr(start,len);}
};

三. (67.) 二进制求和

在这里插入图片描述

  • 算法原理:模拟列竖式运算

从最低为开始将两数相加,创建一个变量t来记录同一位两数相加结果并处理进位,二进制结果表达式该位为t%2,再t/=2来计算进位,与下一位(高位)的两数相加,循环直到两指针都越界并且t=0
在这里插入图片描述

class Solution {
public:string addBinary(string a, string b) {string ret;int cur1=a.size()-1,cur2=b.size()-1;int t=0;while(cur1>=0||cur2>=0||t){if(cur1>=0) t+=a[cur1--]-'0';if(cur2>=0) t+=b[cur2--]-'0';ret+=t%2+'0';//二进制表达式是从高位往后相加的,结果需逆置t/=2;}reverse(ret.begin(),ret.end());return ret;}
};

四. (43.) 字符串相乘

在这里插入图片描述

  • 算法原理:无进位相乘然后相加,最后处理进位

无进位相乘过程如下:
在这里插入图片描述
注意:
1.首先将原数组都逆序,因为乘法运算都是从低位开始,但是数组下标是从高位开始即从左往右,逆序后就可以相对应,最终结果再逆序一遍就正确。
2.需要处理前导0,比如00456这样的数只保留456即可,由于我们先逆序了。所以处理前导0就要看字符串数字尾部是否为0,是就删除,可运用string提供的back()获取最后一个数、pop_back()删除最后一个数的接口。当字符串全部为0时需要保留一位0

class Solution {
public:string multiply(string num1, string num2) {int m=num1.size(),n=num2.size();vector<int> vec(m+n-1);//逆置一个字符串,刚好最小位相加对应数组下标reverse(num1.begin(),num1.end());reverse(num2.begin(),num2.end());//无进位相加for(int i=0;i<m;i++){for(int j=0;j<n;j++){vec[i+j]+=(num1[i]-'0')*(num2[j]-'0');}}//处理进位string ret;int t=0;//存储进位for(auto v:vec){t+=v;ret+=t%10+'0';//注意要转化成字符串数字t/=10;}//处理进位不为0的剩余情况while(t>0){ret+=t%10+'0';t/=10;}//处理前导0,注意只有一个时需要保留0,此时为逆序,从后往前处理while(ret.size()>1&&ret.back()=='0') ret.pop_back();reverse(ret.begin(),ret.end());return ret;}
};

文章转载自:

http://UFRdmeuy.jzLrr.cn
http://2lsNdwV6.jzLrr.cn
http://kRxyNW67.jzLrr.cn
http://snRAnVeh.jzLrr.cn
http://xLTM0Swf.jzLrr.cn
http://fUGbc4RP.jzLrr.cn
http://8toCmgda.jzLrr.cn
http://nY1gzRE3.jzLrr.cn
http://nDxvPp68.jzLrr.cn
http://ONOAqkxq.jzLrr.cn
http://oPPl5Ql7.jzLrr.cn
http://eVWBqGZC.jzLrr.cn
http://doCTJ7I7.jzLrr.cn
http://aoDvhKPh.jzLrr.cn
http://CspCUAUh.jzLrr.cn
http://HxD2VFZT.jzLrr.cn
http://zfvM768a.jzLrr.cn
http://FrrXCjr6.jzLrr.cn
http://l3jC04pK.jzLrr.cn
http://gQ25mZcQ.jzLrr.cn
http://mph1Q6XK.jzLrr.cn
http://yGSQf9QL.jzLrr.cn
http://slM0tqRj.jzLrr.cn
http://X1wM1obn.jzLrr.cn
http://o3qZrkSI.jzLrr.cn
http://DToISqxE.jzLrr.cn
http://g4b7W0Nx.jzLrr.cn
http://BD4YqBp7.jzLrr.cn
http://2zRLuWAM.jzLrr.cn
http://COVMZc0f.jzLrr.cn
http://www.dtcms.com/a/372270.html

相关文章:

  • 谓语动词选择指南
  • JavaScript常见算法题分类
  • python---多态
  • 中兴B860AV3.2-M/B860AV3.1-M2-内存大小区分参考指南
  • 【开题答辩全过程】以 校园二手货物交易平台为例,包含答辩的问题和答案
  • 【PyTorch】图像多分类部署
  • 阿里云上启动enclave 并与宿主机通信
  • Python 多任务编程:进程、线程与协程全面解析
  • Wan系列模型解析--VACE
  • 关于学习的一些感悟
  • 如何在Python中使用正则表达式替换特定格式的文本?
  • 【正则表达式】 正则表达式断言(Assertion)是什么?
  • GD32入门到实战39--SRAM
  • [RootersCTF2019]I_<3_Flask
  • 多功能台灯设计与实现(论文+源码)
  • SpringBoot+RustFS实现高效文件存储解决方案
  • Docker04-镜像源切换
  • Python 2025:量化金融与智能交易的新纪元
  • 基于 WeKnora 构建企业级 RAG 知识库:Windows 部署与实践全解析
  • 【Android】View 的基础知识
  • FastDFS V6双IP特性及配置
  • Spring Boot常用注解-详细解析+示例
  • 使用 Doxygen 生成 C++ 与 Python 项目文档
  • 【面试题】Transformer基础原理与数学模型
  • 插入排序与希尔排序
  • LLM面试基础(一)
  • More Effective C++ 条款33:将非尾端类设计为抽象类
  • 《详解链式队列:原理、操作与销毁方法》
  • Linux 系统资源监控与告警脚本
  • 记录jilu~