算法思想总结:字符串
一、最长公共前缀
. - 力扣(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博客

相关文章:
算法思想总结:字符串
一、最长公共前缀 . - 力扣(LeetCode) 思路1:两两比较 时间复杂度mn 实现findcomon返回两两比较后的公共前缀 class Solution { public:string longestCommonPrefix(vector<string>& strs) {//两两比较 string retstrs[0];size…...
滑块拼图验证码识别
通常滑块验证码都是横向滑动,今天看到一个比较特别的滑块拼图验证码,他不仅能在横向上滑动,还需要进行纵向滑动。如下图所示: 他的滑块在背景图片的左上角,需要鼠标拖动左上角的滑块,移动到背景图的缺口位置…...
Activity启动流程
1 冷启动与热启动 应用启动分为冷启动和热启动。 冷启动:点击桌面图标,手机系统不存在该应用进程,这时系统会重新fork一个子进程来加载Application并启动Activity,这个启动方式就是冷启动。 热启动:应用的热启动比冷…...
PHP转Go系列 | ThinkPHP与Gin框架之OpenApi授权设计实践
大家好,我是码农先森。 我之前待过一个做 ToB 业务的公司,主要是研发以会员为中心的 SaaS 平台,其中涉及的子系统有会员系统、积分系统、营销系统等。在这个 SaaS 平台中有一个重要的角色「租户」,这个租户可以拥有一个或多个子系…...
使用SOAP与TrinityCore交互(待定)
原文:SOAP with TrinityCore | TrinityCore MMo Project Wiki 如何使用SOAP与TC交互 SOAP代表简单对象访问协议,是一种类似于REST的基于标准的web服务访问协议的旧形式。只要必要的配置到位,您就可以利用SOAP向TrinityCore服务器发送命令。 …...
QQ频道导航退出
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/140413538 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
MySQL里的累计求和
在MySQL中,你可以使用SUM()函数来进行累计求和。如果你想要对一个列进行累计求和,可以使用OVER()子句与ORDER BY子句结合,进行窗口函数的操作。 以下是一个简单的例子,假设我们有一个名为sales的表,它有两个列&#x…...
Python爬虫速成之路(3):下载图片
hello hello~ ,这里是绝命Coding——老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹 💥个人主页:绝命Coding-CSDN博客 &a…...
同三维T80004EA编解码器视频使用操作说明书:高清HDMI编解码器,高清SDI编解码器,4K超清HDMI编解码器,双路4K超高清编解码器
同三维T80004EA编解码器视频使用操作说明书:高清HDMI编解码器,高清SDI编解码器,4K超清HDMI编解码器,双路4K超高清编解码器 同三维T80004EA编解码器视频使用操作说明书:高清HDMI编解码器,高清SDI编解码器&am…...
ChatGPT提问获取高质量答案的艺术PDF下载书籍推荐分享
ChatGPT高质量prompt技巧分享pdf, ChatGPT提问获取高质量答案的艺术pdf。本书是一本全面的指南,介绍了各种 Prompt 技术的理解和利用,用于从 ChatGPTmiki sharing中生成高质量的答案。我们将探讨如何使用不同的 Prompt 工程技术来实现不同的目…...
微信小程序中的数据通信
方法1: 使用回调函数 在app.js中:可以在修改globalData后执行一个回调函数,这个回调函数可以是页面传递给app的一个更新函数。// app.js App({globalData: {someData: ,},setSomeData(newData, callback) {this.globalData.someData = newData;if (typeof callback === funct…...
everything搜索不到任何文件-设置
版本: V1.4.1.1024 (x64) 问题:搜索不到任何文件 click:[工具]->[选项]->下图所示 将本地磁盘都选中包含...
python如何结束程序运行
方法1:采用sys.exit(0),正常终止程序,从图中可以看到,程序终止后shell运行不受影响。 方法2:采用os._exit(0)关闭整个shell,从图中看到,调用sys._exit(0)后整个shell都重启了(RESTAR…...
InnoDB
InnoDB 是 MySQL 默认的存储引擎,它提供了事务支持、行级锁定和外键约束等高级功能。下面详细解析 InnoDB 的一些底层原理和关键特性。 1. 数据存储结构 表空间(Tablespace) InnoDB 使用表空间来管理数据存储,表空间可以是共享…...
spark运行报错:Container killed by YARN for exceeding memory limits
用spark跑数据量大的离线调度任务报错:Reason: Container killed by YARN for exceeding memory limits. 19.0 GB of 19 GB physical memory used. Consider boosting spark.yarn.executor.memoryOverhead or disabling yarn.nodemanager.vmem-check-enabled becaus…...
(三)大模型/人工智能/机器学习/深度学习/NLP
一.模型 模型,简单来说,就是用来表示或解释某个事物、现象或系统的一种工具或框架。它可以是实体的,也可以是虚拟的,目的是为了帮助我们更好地理解和预测所描述的对象。在生活中,模型无处不在,它们以各种形…...
数学基础 -- 三角学
三角学 三角学(Trigonometry)是数学的一个分支,主要研究三角形的边长与角度之间的关系。三角学在几何学、物理学、工程学等多个领域中有广泛的应用。以下是三角学的一些基本概念和公式: 基本概念 直角三角形:一个角…...
基于BitMap的工作日间隔计算
背景问题 在我们实际开发过程中,时常会遇到日期的间隔计算,即计算多少工作日之后的日期,在不考虑法定节假日的情况下也不是那么复杂,毕竟周六、周日是相对固定的,Java语言也提供了丰富的类来处理此问题。 然而&#x…...
sqlite3 — DB-API 2.0 interface for SQLite databases
sqlite3 — DB-API 2.0 interface for SQLite databases — Python 3.12.4 documentation sqlite3 — DB-API 2.0 interface for SQLite databasessqlite3 — SQLite数据库的DB-API 2.0接口 Source code: Lib/sqlite3/ 源代码位置:Lib/sqlite3/ SQLite is a C…...
Spring Boot中的安全配置与实现
Spring Boot中的安全配置与实现 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将深入探讨Spring Boot中的安全配置与实现,看看如何保护你的…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Psychopy音频的使用
Psychopy音频的使用 本文主要解决以下问题: 指定音频引擎与设备;播放音频文件 本文所使用的环境: Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
comfyui 工作流中 图生视频 如何增加视频的长度到5秒
comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗? 在ComfyUI中实现图生视频并延长到5秒,需要结合多个扩展和技巧。以下是完整解决方案: 核心工作流配置(24fps下5秒120帧) #mermaid-svg-yP…...

