算法思想总结:字符串

一、最长公共前缀

. - 力扣(LeetCode)

思路1:两两比较  时间复杂度mn  实现findcomon返回两两比较后的公共前缀

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {//两两比较 string ret=strs[0];size_t n=strs.size();for(size_t i=0;i<n;++i)ret=findcommon(ret,strs[i]);return ret;}string findcommon(string&s1,string&s2){size_t n=min(s1.size(),s2.size());size_t i=0;for(;i<n;++i)if(s1[i]!=s2[i]) break;return s1.substr(0,i);}
};

 思路2:统一比较  时间复杂度mn

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {//统一比较size_t m=strs.size(),n=strs[0].size();for(int i=0;i<n;++i){char temp=strs[0][i];for(int j=0;j<m;++j)if(i==strs[j].size()||strs[j][i]!=temp)return strs[0].substr(0,i); }return strs[0];//可能只有一个字符串}
};

二、最长回文子串

. - 力扣(LeetCode)

解法:中心扩展算法

1、固定一个中心点,从中心点开始往两边扩展

2、要考虑奇数长度,也要考虑偶数长度

class Solution {
public:string longestPalindrome(string s) {size_t begin=0; size_t len=0;//帮助我们记录符合要求的回文子串//中心扩展算法size_t n=s.size();for(size_t i=0;i<n;++i){int left=i,right=i;//考虑奇数回文串while(left>=0&&right<n&&s[left]==s[right]) {--left;++right;}if(right-left-1>len) {begin=left+1;len=right-left-1;}//考虑偶数回文串left=i;right=i+1;//考虑奇数回文串while(left>=0&&right<n&&s[left]==s[right]) {--left;++right;}if(right-left-1>len) {begin=left+1;len=right-left-1;}}return s.substr(begin,len);}
};

三、二进制求和(字符串相加)

. - 力扣(LeetCode)

解法:模拟进位相加,但是区别就是得逢2进1 ,再将最后的结果逆序。

class Solution {
public:string addBinary(string a, string b) {//模拟进位相加,但是区别就是逢2进1size_t n1=a.size(),n2=b.size();string ret;//返回   从后往前模拟进位相加ret.reserve(n1>n2?n1+1:n2+1);//提前开空间  减少时间消耗int cur1=n1-1; int cur2=n2-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;}
};

 四、字符串最后一个单词的长度

字符串最后一个单词的长度_牛客题霸_牛客网

该题不能用cin>>s 因为遇到空格就会停止,所以要解决这个问题就必须用getline

而string中的rfind可以帮助我们从后往前找。

#include <iostream>
using namespace std;int main() 
{string s;getline(cin,s);//接受一个带空格的字符串cout<<s.size()-1-s.rfind(" ")<<endl;//while(cin>>s);//cout<<s.size();return 0;
}

因为该题凑巧找的是最后一个,所以也可以直接用while(cin>>s) 最后会接受到最后一个字符串

五、仅仅翻转字母

. - 力扣(LeetCode)

       非英文字符保存在原地,而英文字母翻转,所以我们可以用双指针分别指向字符串的首尾位置,如果遇到非字母的就往中间靠,当两个指针指向的都是字母的时候,交换两个指针指向的字母即可 

class Solution {
public:string reverseOnlyLetters(string s){//双指针法size_t begin=0;size_t end=s.size()-1;while(begin<end){while(begin<end&&!isalpha(s[begin])) ++begin;while(begin<end&&!isalpha(s[end]))   --end;swap(s[begin],s[end]);++begin;--end;}return s;}
};

六、验证回文串

. - 力扣(LeetCode)

       验证回文串,只需要用双指针指向首尾的位置,对非字母数字的直接跳过,当两个指针停下来的时候判断对应位置的字母是不是相同的。

class Solution {
public:bool isPalindrome(string s){//双指针往中间靠,直到相遇则回文  int length=s.size();int left=0,right=length-1;while(left<right){while(left<right&&!isalnum(s[left]))  ++left;while(left<right&&!isalnum(s[right])) --right;if(left<right)if(tolower(s[left])!=tolower(s[right]))return false;++left;--right;}return true;}
};

七、反转字符串II

. - 力扣(LeetCode)

class Solution {
public:string reverseStr(string s, int k){int n=s.size();for(int i=0;i<n;i+=2*k)reverse(s.begin()+i,s.begin()+min(i+k,n));return s;}
};

需要注意的是如果i+k超过了n,就要将他修正为n。

 八、反转字符串III

双指针,始终让两个指针指向字符串中某个单词的头和尾,然后进行反转。 

class Solution {
public:string reverseWords(string s){int head=0,tail=0;//双指针法int length=s.size();while(head<length){if(s[head]!=' '){while(tail<length&&s[tail]!=' ')++tail;reverse(s.begin()+head,s.begin()+tail);}++tail;head=tail;}return s;}
};

 九、字符串相乘(重点)

. - 力扣(LeetCode)

class Solution {
public: //从后往前不需要处理前导0string multiply(string num1, string num2){ //高位相乘补0   处理前导0  最后处理进位if(num1=="0"||num2=="0") return "0";string ret="0";//处理返回值 方便进行相加int m = num1.size(), n = num2.size();for(int i=n-1;i>=0;--i){string cur;int add=0;//处理进位for(int j=n-1;j>i;--j) //为了高位的补0cur.push_back('0');int y=num2[i]-'0';//取出这一位for(int j=m-1;j>=0;--j){int x=num1[j]-'0';int product=x*y+add;cur.push_back(product%10+'0');add=product/10;//保留进位}while(add!=0){cur.push_back(add%10+'0');add/=10;}reverse(cur.begin(),cur.end());ret= addBinary(ret, cur);}return ret;}string addBinary(string a, string b) {//模拟进位相加,但是区别就是逢2进1size_t n1=a.size(),n2=b.size();string ret;//返回   从后往前模拟进位相加ret.reserve(n1>n2?n1+1:n2+1);//提前开空间  减少时间消耗int cur1=n1-1; int cur2=n2-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%10+'0';t/=10;}reverse(ret.begin(),ret.end());//结果要反转一下return ret;}
};

class Solution {
public:string multiply(string num1, string num2) {//处理相乘问题->1、先无进位相乘 2、然后相加 3、然后处理进位  4、然后处理前导0size_t m=num1.size(),n=num2.size();//准备工作,模拟进位前将两个字符串先进行逆序reverse(num1.begin(),num1.end());reverse(num2.begin(),num2.end());vector<size_t> temp(m+n-1);for(size_t i=0;i<m;++i) //无进位相乘for(size_t j=0;j<n;++j) temp[i+j]+=(num1[i]-'0')*(num2[j]-'0');//无进位相乘后累加//处理进位size_t cur=0,t=0;//t是进位信息string ret;ret.reserve(m+n);//优化一下,提前开空间while(cur<m+n-1||t) {if(cur<m+n-1) t+=temp[cur++];ret+=t%10+'0';t/=10;}//3 处理前导0while(ret.size()>1&&ret.back()=='0') ret.pop_back();reverse(ret.begin(),ret.end());return ret;}
};

十、字符串中常用的一些接口

C语言相关:

C语言:字符函数和字符串函数-CSDN博客

 C++相关:

C++:String类的使用-CSDN博客

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

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

相关文章

MySQL里的累计求和

在MySQL中&#xff0c;你可以使用SUM()函数来进行累计求和。如果你想要对一个列进行累计求和&#xff0c;可以使用OVER()子句与ORDER BY子句结合&#xff0c;进行窗口函数的操作。 以下是一个简单的例子&#xff0c;假设我们有一个名为sales的表&#xff0c;它有两个列&#x…

Android之间互传消息之ServerSocket,Android服务端接收Socket发送的TCP

Android之间在在局域网下互传消息&#xff0c;咱就不用走云服务器了吧&#xff0c;让俩安卓设备&#xff0c;自己传呗 方式1 通过在安卓设备上搭建Web服务器接收数据&#xff0c;可参考 Android使用AndServer在安卓设备上搭建服务端(Java)(Kotlin)两种写法 方式2 本文章&…

Open3d入门 点云中的重要概念

点云是由一组三维空间中的点组成的数据结构&#xff0c;常用于计算机视觉、3D建模和地形图生成等领域。每个点包含空间坐标&#xff08;x, y, z&#xff09;以及其他属性&#xff08;如颜色、密度等&#xff09;。以下是一些重要的点云概念&#xff1a; 1. 体素 (Voxel) 体素…

Vue3+Vite+TS+Axios整合详细教程

1. Vite 简介 Vite是新一代的前端构建工具&#xff0c;在尤雨溪开发Vue3.0的时候诞生。类似于Webpack Webpack-dev-server。其主要利用浏览器ESM特性导入组织代码&#xff0c;在服务器端按需编译返回&#xff0c;完全跳过了打包这个概念&#xff0c;服务器随起随用。生产中利用…

赛氪网荣获2024年中国高校计算机教育大会合作伙伴荣誉

2024年7月13日&#xff0c;在黑龙江哈尔滨召开的“2024年中国高校计算机教育大会&#xff08;CCEC2024&#xff09;”&#xff0c;环球赛乐&#xff08;北京&#xff09;科技有限公司(以下简称”赛氪网“)凭借其在高等教育与科技创新领域的卓越贡献&#xff0c;荣幸地获得了本次…

Python基础——函数

函数 和c语言函数意义相同&#xff0c;函数定义基础语法如下。 def 函数名&#xff08;传入参数&#xff09;:函数体return 返回值 展示自定义一个函数并对其进行封装。 # 自定义函数字符串长度计算str1 "itcast" count0 for x in str1:count 1 print(f"{c…

昇思25天学习打卡营第20天|CycleGAN图像风格迁移互换

模型简介 CycleGAN(Cycle Generative Adversarial Network) 即循环对抗生成网络&#xff0c;来自论文 Unpaired Image-to-Image Translation using Cycle-Consistent Adversarial Networks 。该模型实现了一种在没有配对示例的情况下学习将图像从源域 X 转换到目标域 Y 的方法。…

0基础学会在亚马逊云科技AWS上利用SageMaker、PEFT和LoRA高效微调AI大语言模型(含具体教程和代码)

项目简介&#xff1a; 小李哥今天将继续介绍亚马逊云科技AWS云计算平台上的前沿前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS上的AI软甲开发最佳实践&#xff0c;并应用到自己的日常工作里。本次介绍的是如何在Amazon SageMaker上…

【学习笔记】无人机(UAV)在3GPP系统中的增强支持(九)-无人机服务区分离

引言 本文是3GPP TR 22.829 V17.1.0技术报告&#xff0c;专注于无人机&#xff08;UAV&#xff09;在3GPP系统中的增强支持。文章提出了多个无人机应用场景&#xff0c;分析了相应的能力要求&#xff0c;并建议了新的服务级别要求和关键性能指标&#xff08;KPIs&#xff09;。…

Solidworks工程图替换参考零件

1.用solidworks选择工程图文件&#xff0c;点击参考。 2.双击文件名 3.选择新的参考零件&#xff0c;点击确定。

[ruby on rails]部署时候产生ActiveRecord::PreparedStatementCacheExpired错误的原因及解决方法

一、问题&#xff1a; 有时在 Postgres 上部署 Rails 应用程序时&#xff0c;可能会看到 ActiveRecord::PreparedStatementCacheExpired 错误。仅当在部署中运行迁移时才会发生这种情况。发生这种情况是因为 Rails 利用 Postgres 的缓存准备语句(PreparedStatementCache)功能来…

力扣第406场周赛

力扣第406场周赛 100352. 交换后字典序最小的字符串 - 力扣&#xff08;LeetCode&#xff09; 贪心&#xff0c;从 0 0 0开始扫描到 n n n如果有一个可以交换的就立马交换 class Solution { public:string getSmallestString(string s) {for(int i1;i<s.size();i){if(s[i…

【PyQt】

PyQT5线程基础&#xff08;2&#xff09; 线程案例案例一案例二 线程案例 案例一 案例一代码通过线程实现点击按钮向线程传输地址&#xff0c;程序等待20秒后&#xff0c;返回结果。 通过QtDesigner创建如下图所示的界面ui&#xff0c;并用UIC工具转成对应的py文件。 Ui_tes…

C语言之指针的奥秘(三)

一、字符指针变量 在指针的类型中&#xff0c;有字符指针char*&#xff0c;一般使用&#xff1a; #include<stdio.h> int main() {char ch w;char* p &ch;*p w;return 0; } 还有一种方式&#xff1a; #include<stdio.h> int main() {const char* p &qu…

123456

截止2023年10月&#xff0c;目前已公开的官方矢量数据有3个网站&#xff0c;按照公开时间顺序分别是&#xff1a;1&#xff09;全国地理信息资源目录服务系统&#xff1b;2&#xff09;西藏自治区自然资源厅&#xff1b;3&#xff09;福建省标准地图服务。我们将持续更新公开的…

2024较火的软件宣传单页HTML源码

源码介绍 2024较火的软件宣传单页HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果 效果截图 源码获取 2024较火的软件宣传单页HTML源码

自动驾驶可能解决的问题

首先是各种盲区&#xff0c;雷达可能检测到各种东西&#xff0c;而这些是视觉注意不到的 然后是每辆车可以互联互通&#xff0c;整体规划路线

Java二十三种设计模式-单例模式(1/23)

引言 在软件开发中&#xff0c;设计模式是一套被反复使用的、大家公认的、经过分类编目的代码设计经验的总结。单例模式作为其中一种创建型模式&#xff0c;确保一个类只有一个实例&#xff0c;并提供一个全局访问点。本文将深入探讨单例模式的概念、实现方式、使用场景以及潜…

通讯录管理(C++入门练习)

通讯录管理系统 系统需求&#xff1a; 通讯录是一个可以记录亲人、好友信息的工具。本文主要利用C来实现一个通讯录管理系统系统中需要实现的功能如下: 添加联系人:向通讯录中添加新人&#xff0c;信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人 显示联系…

昇思25天学习打卡营第21天|DCGAN生成漫画头像

DCGAN原理 DCGAN&#xff08;深度卷积对抗生成网络&#xff0c;Deep Convolutional Generative Adversarial Networks&#xff09;是GAN的直接扩展。不同之处在于&#xff0c;DCGAN会分别在判别器和生成器中使用卷积和转置卷积层。 它最早由Radford等人在论文Unsupervised Re…