【算法系列】字符串

目录

leetcode题目

一、最长公共前缀

二、最长回文子串

三、二进制求和

四、字符串相加

五、字符串相乘

六、仅仅反转字母

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

八、验证回文串

九、反转字符串

十、反转字符串 II

十一、反转字符串中的单词 III


leetcode题目

一、最长公共前缀

14. 最长公共前缀 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/longest-common-prefix/1.题目解析

求所有字符串的最长公共前缀

2.算法分析

解法一: 将所有字符串两两比较,求最长公共前缀

解法二: 统一比较所有字符串,当某个字符串的i位置字符不相等,或者i位置在某个字符串中越界,就停止比较, 返回结果即可

3.算法代码

解法一:

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {string ret = strs[0];for(int i = 1; i < strs.size(); i++)ret = find_common(ret, strs[i]);return ret;}string find_common(string s1, string s2){int i = 0;while(i < s1.size() && i < s2.size() && s1[i] == s2[i])i++;return s1.substr(0, i);}
};

解法二:

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() || tmp != strs[j][i])return strs[0].substr(0, i);}return strs[0];}
};

二、最长回文子串

5. 最长回文子串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/longest-palindromic-substring/description/1.题目解析

求一个字符串的最长回文子串

2.算法分析

中心扩展算法:

1.固定一个中心点

2.从中心点开始,向两边扩展
注意: 奇数长度以及偶数长度都需要考虑

时间复杂度 O(N^2)

3.算法代码

class Solution {
public:string longestPalindrome(string s) {int begin = 0, len = 0, n = s.size();for(int i = 0; i < n; i++) //1.固定一个中心点{//2.从中心点开始,向两边扩展//2.1 奇数长度的扩展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;}//2.2 偶数长度的扩展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);}
};

三、二进制求和

1.题目解析

给两个二进制字符串,以二进制字符串形式返回他们的和

2.算法分析

定义两个下标,从字符串结尾开始向前遍历相加,t 存储相加后的结果,注意进位即可~

3.算法代码

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) //有可能cur1和cur2都走到了空,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;}
};

四、字符串相加

415. 字符串相加 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/add-strings/1.题目解析

以字符串形式给出两个整数,返回两整数相加之后的字符串形式

2.算法分析

本题与题目三 "二进制求和" 解法是完全一样的,大家参照题目三即可~

3.算法代码

class Solution 
{
public:string addStrings(string num1, string num2) {int cur1 = num1.size()-1, cur2 = num2.size()-1;int t = 0;string ret;while(cur1 >= 0|| cur2 >= 0 || t){if(cur1 >= 0) t += num1[cur1--] - '0';if(cur2 >= 0) t += num2[cur2--] - '0';ret += t % 10 + '0';t /= 10;}reverse(ret.begin(), ret.end());return ret;}
};

五、字符串相乘

43. 字符串相乘 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/multiply-strings/1.题目解析

给定以字符串形式给出的两个非负整数,以字符串形式返回两数的乘积

2.算法分析

解法一:模拟列竖式运算 (也就是我们在演草纸上如何算乘法,就如何写代码即可

解法二:对解法一优化 -> 无进位相乘再相加,最后处理进位

下标的规律:  当计算下标为 i 和下标为 j 的两个数相乘时,最终结果放在下标为 i+j 的位置即可

细节问题:处理前导0, 当相乘的两个数字有1个为0时,结果应该是0,但是我们的做法算出来是0000等,因此需要特殊处理

3.算法代码

class Solution {
public:string multiply(string n1, string n2) {//1.准备工作int m = n1.size(), n = n2.size();reverse(n1.begin(), n1.end()); //123->321reverse(n2.begin(), n2.end()); //456->654vector<int> tmp(m+n-1);//2.无进位相乘然后相加for(int i = 0; i < m; i++)for(int j = 0; j < n; j++)tmp[i+j] += (n1[i] - '0') * (n2[j] - '0');//3.处理进位int cur = 0, t = 0;string ret;while(cur < m + n -1 || t != 0){if(cur < m+n-1) t += tmp[cur++];ret += t % 10 + '0';t /= 10;}//4.处理前导零while(ret.size() > 1 && ret.back() == '0') ret.pop_back(); reverse(ret.begin(), ret.end());return ret;}
};

六、仅仅反转字母

917. 仅仅反转字母 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-only-letters/1.题目解析

给定一个字符串,只将字母翻转,其他字符不变

2.算法分析

双指针策略: left从头遍历,right从尾遍历,遍历过程中,遇到非字母,left++, right--, 遇到了字母,就交换即可~

ps: 判断字符是否是字母借助库函数: isalpha

3.算法代码

class Solution {
public:string reverseOnlyLetters(string s) {size_t left = 0, right = s.size() -1;while(left < right){while(left < right && !isalpha(s[left]))left++;while(left < right && !isalpha(s[right]))right--;swap(s[left], s[right]);left++;right--;}return s;}
};

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

字符串最后一个单词的长度_牛客题霸_牛客网 (nowcoder.com)icon-default.png?t=N7T8https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224&rp=5&ru=/activity/oj&qru=/ta/huawei/question-ranking1.题目解析

字符串中的单词以空格分割,求出字符串最后一个单词的长度

2.算法分析

直接调用string类的接口rfind, 从右向左找到第一个空格位置pos即可,用字符串总长度-pos-1

3.算法代码

#include <iostream>
using namespace std;
int main() 
{string s;while(getline(cin, s)){int pos = s.rfind(' ');cout << s.size() - pos - 1;}return 0;
}

八、验证回文串

125. 验证回文串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/valid-palindrome/1.题目解析

移除所有的非字母数字字符并且大写转小写之后,正着读和反着读是一样的,则是回文串

2.算法分析

先将所有的大写字母转为小写字母或是将所有的小写字母转为大写字母,然后双指针遍历即可!遍历过程中注意 left < right ,防止越界访问,并且不能加等号, 因为当 s= ",." 时,会出现误判~

3.算法代码

class Solution {
public:bool isPalindrome(string s) {//大写转小写for(auto& e: s)e = tolower(e);//验证回文串int left = 0, right = s.size()-1;while(left < right){while(left < right && !isalpha(s[left]) && !isdigit(s[left])) left++;while(left < right && !isalpha(s[right]) && !isdigit(s[right])) right--;if(s[left] != s[right]) return false;left++, right--;}return true;}
};

九、反转字符串

344. 反转字符串 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-string/description/1.题目解析

反转字符串

2.算法分析

双指针策略

3.算法代码

class Solution {
public:void reverseString(vector<char>& s) {int left = 0;int right = s.size()-1;while(left < right){swap(s[left], s[right]);left++;right--;}}
};

十、反转字符串 II

541. 反转字符串 II - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-string-ii/

1.题目解析

每2k个字符翻转前k个字符,如果剩余字符少于k个,则全部反转,如果剩余字符在k到2k之间,则翻转前k个字符,剩余字符保持不变~

2.算法分析

3.算法代码

class Solution {
public:string reverseStr(string s, int k) {int i= 0;while(s.begin()+2*k*i+k < s.end()){reverse(s.begin()+2*k*i, s.begin()+2*k*i+k);i++;}if(s.begin()+2*k*i < s.end())reverse(s.begin()+2*k*i, s.end()); //剩余字符<k个,全部翻转return s;}
};

十一、反转字符串中的单词 III

557. 反转字符串中的单词 III - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-words-in-a-string-iii/

1.题目解析

反转字符串中的所有单词

2.算法分析

使用string提供的find接口,start下标记录一个单词的开始位置,finish下标记录单词结束后的空格位置,用reverse函数对单词进行翻转,start置成下一个单词的开始位置(finish+1), 然后重复上述过程~

3.算法代码

class Solution {
public:string reverseWords(string s) {size_t start = 0, finish = 0;while(finish != s.size()){finish = s.find(' ', start); //从start位置开始找空格if(finish == string::npos) finish = s.size(); //最后一个单词后面没有空格,将finish置成最后一个位置reverse(s.begin() + start, s.begin() + finish);start = finish + 1; //把start置成下一个单词的第一个位置}return s;}
};

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

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

相关文章

frp内网穿透服务搭建与使用

frp内网穿透服务搭建与使用 1、frp简介 frp 是一个专注于内网穿透的高性能的反向代理应用&#xff0c;支持 TCP、UDP、HTTP、HTTPS 等多种协议。 可以将内网服务以安全、便捷的方式通过具有公网 IP 节点的中转暴露到公网。frp工作原理 服务端运行&#xff0c;监听一个主端口…

Parts2Whole革新:多参照图定制人像,创新自定义肖像生成框架!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; Parts2Whole革新&#xff1a;多参照图定制人像&#xff0c;创新自定义肖像生成框架&#xff01; 引言&#xff1a;探索多条件人像生成的新篇章 在数字内容创作…

论文精读-存内计算芯片研究进展及应用

文章目录 论文精读-存内计算芯片研究进展及应用概述背景介绍前人工作 存内计算3.1 SRAM存内计算3.2 DRAM存内计算3.3 ReRAM/PCM存内计算3.4 MRAM存内计算3.5 NOR Flash存内计算3.6 基于其他介质的存内计算3.7 存内计算芯片应用场景 总结QA 论文精读-存内计算芯片研究进展及应用…

SpringBoot中实现发送邮件

概要 在Spring Boot中发送电子邮件相对简单。你可以使用Spring的邮件支持来实现这一点。 步骤&#xff1a; 1.添加依赖&#xff1a;首先&#xff0c;需要在你的pom.xml文件中添加Spring Boot的邮件发送器依赖。 2. 配置邮件服务器&#xff1a;在application.properties或app…

嵌入式全栈开发学习笔记---C语言笔试复习大全14

目录 指针初级 指针的概念 指针类型 指针类型长度 指针的定义 通过指针访问数据 p1和*p1的区别 指针做函数参数 上一篇复习了8道编程题&#xff0c;这篇开始正式复习之指针&#xff01; 说明&#xff1a;我们学过单片机的一般都是有C语言基础的了&#xff0c;网上关于C…

网络 IO 模式

同步 IO 与异步 IO 同步 IO 和异步 IO 是关于数据读写方式的两种不同模式。 同步 IO 是指在程序读写数据时&#xff0c;需要等待操作完成后才能继续执行后面的程序。这种模式下&#xff0c;当程序使用阻塞式 IO 时&#xff0c;会一直等待IO操作完成&#xff0c;程序会暂停执行…

​​【收录 Hello 算法】3.3 数字编码

目录 3.3 数字编码 3.3.1 原码、反码和补码 3.3.2 浮点数编码 3.3 数字编码 Tip 在本书中&#xff0c;标题带有 * 符号的是选读章节。如果你时间有限或感到理解困难&#xff0c;可以先跳过&#xff0c;等学完必读章节后再单独攻克。 3.3.1 原码、反码和补码 在…

一、RocketMQ基本概述与部署

RocketMQ基本概述与安装 一、概述1.MQ概述1.1 用途1.2 常见MQ产品1.3 MQ常用的协议 2.RocketMQ概述2.1 发展历程 二、相关概念1.基本概念1.1 消息&#xff08;Message&#xff09;1.2 主题&#xff08;Topic&#xff09;1.3 标签&#xff08;Tag&#xff09;1.4 队列&#xff0…

RK3576芯片规格,以及与RK3588对比

瑞芯微RK3576是一款高性能、低功耗的SoC&#xff08;系统级芯片&#xff09;处理器&#xff0c;适用于基于ARM的PC、边缘计算设备、个人移动互联网设备等多种应用场景。它采用Arm架构的八核心CPU&#xff0c;集成了GPU、MCU、NPU、VPU等多种计算核心&#xff0c;并具有丰富的外…

Go Web 开发 Demo【用户登录、注册、验证】

前言 这篇文章主要是学习怎么用 Go 语言&#xff08;Gin&#xff09;开发Web程序&#xff0c;前端太弱了&#xff0c;得好好补补课&#xff0c;完了再来更新。 1、环境准备 新建项目&#xff0c;生成 go.mod 文件&#xff1a; 出现报错&#xff1a;go: modules disabled by G…

ttkbootstrap界面美化系列之Menubutton(五)

一&#xff1a;Menubutton接口 print(help(help(ttk.Menubutton))) Help on class Menubutton in module tkinter.ttk:class Menubutton(Widget)| Menubutton(masterNone, **kw)|| Ttk Menubutton widget displays a textual label and/or image, and| displays a menu wh…

Qt | QComboBox(组合框)

01、上节回顾 Qt 基础教程合集02、QComBox 一、QComboBox 类(下拉列表、组合框) 1、QComboBox 类是 QWidget 类的直接子类,该类实现了一个组合框 2、QComboBox 类中的属性 ①、count:const int 访问函数:int count() const; 获取组合框中的项目数量,默认情况下,对于空…

动态规划——路径问题:LCR 166.珠宝的最高价值

文章目录 题目描述算法原理1.状态表示&#xff08;题目经验&#xff09;2.状态转移方程3.初始化4.填表顺序5.返回值 代码实现CJava 题目描述 题目链接&#xff1a;LCR 166.珠宝的最高价值 算法原理 1.状态表示&#xff08;题目经验&#xff09; 对于这种路径类的问题&…

Windows系统和unbtun系统连接usb 3.0海康可见MVS和红外艾睿相机

一.海康可见USB3.0工业面阵相机 海康usb相机需要去海康官网上下载对应系统的MVS客户端及SDK开发包 海康机器人-机器视觉-下载中心 选择Windows系统和unbtun&#xff08;我是linux aarch64,所以选择了对应压缩包解压&#xff09; Windows系统 1.双击安装包进入安装界面&…

自学错误合集--项目打包报错,运行报错持续更新中

java后端自学错误总结 一.项目打包报错2.项目打包之后运行报错 二.项目运行报错 一.项目打包报错 javac: &#xfffd;Ҳ&#xfffd;&#xfffd;&#xfffd;&#xfffd;ļ&#xfffd;: E:\xx\xx\xx\docer-xx\src\main\java\xx\xx\xx\xx\xx\xx.java &#xfffd;&#xff…

C/C++ BM30 二叉搜索树与双向链表

文章目录 前言题目解决方案一1.1 思路阐述1.2 源码 解决方案二2.1 思路阐述2.2 源码 总结 前言 这道题要明白二叉搜索树的概念&#xff0c;同时还要对链表的知识比较熟悉。 题目 输入一棵二叉搜索树&#xff0c;将该二叉搜索树转换成一个排序的双向链表。如下图所示 数据范…

鸿蒙开发接口Ability框架:【@ohos.application.missionManager (missionManager)】

missionManager missionManager模块提供系统任务管理能力&#xff0c;包括对系统任务执行锁定、解锁、清理、切换到前台等操作。 说明&#xff1a; 本模块首批接口从API version 8开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 impo…

Sentinel-Dashboard安装

1. Docker官方镜像 找到跟你版本相对于的镜像进行拉取&#xff1a; &#xfeff;https://hub.docker.com/r/bladex/sentinel-dashboard # 运行容器 Sentinel默认端口 8858 docker run --name sentinel-dashboard -p 8858:8858 -d bladex/sentinel-dashboard:1.8.6 &#xfeff…

【k8s】利用Kubeadm搭建k8s1.29.x版本+containerd

文章目录 前言1.准备的三台虚拟机2.安装 kubeadm 前的准备工作3.安装containerd1.解压安装包2.生成默认配置文件3.使用systemd托管containerd4.修改默认配置文件 4.安装runc5.安装 CNI plugins5.1 安装nerdctl 6.安装 kubeadm、kubelet 和 kubectl6.1 配置crictl 7.初始化集群1…

wordpress忘记后台密码,在数据库中修改回来,然后再修改回去。

源地址&#xff1a;https://www.ctvol.com/seoomethods/1421332.html 我们在做wordpess运维的时候&#xff0c;都会遇到很尴尬的时候&#xff0c;有时候在错误运维中&#xff0c;不知道删除了什么东西&#xff0c;造成wordpress后台不能登录&#xff0c;后台页面也直接失效&am…