算法沉淀——字符串(leetcode真题剖析)

在这里插入图片描述

算法沉淀——字符串

  • 01.最长公共前缀
  • 02.最长回文子串
  • 03.二进制求和
  • 04.字符串相乘

01.最长公共前缀

题目链接:https://leetcode.cn/problems/longest-common-prefix/

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

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

示例 1:

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

示例 2:

输入:strs = ["dog","racecar","car"]
输出:""
解释:输入不存在公共前缀。

提示:

  • 1 <= strs.length <= 200
  • 0 <= strs[i].length <= 200
  • strs[i] 仅由小写英文字母组成

思路

这里我们可以两两比较,也可以同时比较,这里我使用的是同时比较相同下标的字母,遇到不同或者其中一个字符串越界直接返回即可,若循环结束没有返回,则说明只有一个字符串,返回第一个字符串即可。

代码

class Solution {
public:string longestCommonPrefix(vector<string>& strs) {for (int i = 0; i < strs[0].size(); ++i) {for (int j = 1; j < strs.size(); ++j) {// 检查当前位置是否越界或者字符不相等,如果是则返回前缀if (i == strs[j].size() || strs[0][i] != strs[j][i]) return strs[0].substr(0, i);}}return strs[0]; // 没进入第二个for循环,说明只有一个字符串}
};

02.最长回文子串

题目链接:https://leetcode.cn/problems/longest-palindromic-substring/

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

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

示例 1:

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

示例 2:

输入:s = "cbbd"
输出:"bb"

提示:

  • 1 <= s.length <= 1000
  • s 仅由数字和英文字母组成

思路

这里我们可以采用中心扩散的方式,计算以每一个字母为中心向左右两边扩散的奇数和偶数的回文串最大长度和该回文串的起始位置,最后返回最长回文串。

代码

class Solution {
public:string longestPalindrome(string s) {int begin = 0, len = 0, n = s.size();for (int 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);}
};

03.二进制求和

题目链接:https://leetcode.cn/problems/add-binary/

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= a.length, b.length <= 104
  • ab 仅由字符 '0''1' 组成
  • 字符串如果不是 "0" ,就不含前导零

思路

其实和之前链表中的两数之和的原理是一样的,只不过那个是十进制,而这里是二进制,我们累加进位拼接字符串,计算完之后,不要忘了我们是逆序相加的,所以最后还需要翻转字符串。

代码

class Solution {
public:string addBinary(string a, string b) {string ret;int cur1=a.size()-1,cur2=b.size()-1,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;}
};

04.字符串相乘

题目链接:https://leetcode.cn/problems/multiply-strings/

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

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

示例 1:

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

示例 2:

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

提示:

  • 1 <= num1.length, num2.length <= 200
  • num1num2 只能由数字组成。
  • num1num2 都不包含任何前导零,除了数字0本身。

思路

整体思路就是模拟我们小学列竖式计算两个数相乘的过程。但为了我们书写代码的方便性,我们选择一种优化版本,在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去考虑进位。

代码

class Solution {
public:string multiply(string num1, string num2) {int m = num1.size(), n = num2.size();// 反转两个字符串,方便从低位开始相乘reverse(num1.begin(), num1.end());reverse(num2.begin(), num2.end());// 存放每一位相乘的结果vector<int> tmp(m + n - 1, 0);// 逐位相乘for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {tmp[i + j] += (num1[i] - '0') * (num2[j] - '0');}}string ret;int cur = 0, carry = 0;// 处理进位和构建结果字符串while (cur < m + n - 1 || carry) {if (cur < m + n - 1) carry += tmp[cur++];ret += carry % 10 + '0';carry /= 10;}// 去除结果字符串前导零,保留最后一位 '0'while (ret.size() > 1 && ret.back() == '0') ret.pop_back();// 反转结果字符串reverse(ret.begin(), ret.end());return ret;}
};

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

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

相关文章

UnityShader玉石效果

效果&#xff1a; 代码&#xff1a; Shader "MyShader/Jade" {Properties{_DiffuseColor("漫反射颜色",color)(1,1,1,1)_ThicknessMap("厚度图",2d)"white"{}_AddColor("叠加颜色",color)(1,1,1,1)_CubeMap("环境贴图…

steam搬砖项目,“一个月赚8K+”真的假的?

在游戏中&#xff0c;搬砖党是永远都不能忽视的存在&#xff0c;随着游戏产业的不断发展&#xff0c;普通人也可以在steam搬砖项目中找到自己的生财之道。由于是低技术的重复工作&#xff0c;和现实的搬砖类似&#xff0c;所以才叫steam搬砖项目。 steam搬砖项目其实就和pdd无…

C++ 动态规划 线性DP 最短编辑距离

给定两个字符串 A 和 B &#xff0c;现在要将 A 经过若干操作变为 B &#xff0c;可进行的操作有&#xff1a; 删除–将字符串 A 中的某个字符删除。 插入–在字符串 A 的某个位置插入某个字符。 替换–将字符串 A 中的某个字符替换为另一个字符。 现在请你求出&#xff0c;将…

论文浅尝 | 在图上思考:基于知识图谱的深度且负责的大语言模型推理

笔记整理&#xff1a;孙硕硕&#xff0c;东南大学硕士&#xff0c;研究方向为自然语言处理 链接&#xff1a;https://arxiv.org/abs/2307.07697 1. 动机 本文的动机是大型语言模型在各种任务中取得了较大的进步&#xff0c;但它们往往难以完成复杂的推理&#xff0c;并且在知识…

代码随想录|day 16

Day 16 迎财神 坚持如此hard 玄之又玄&#xff0c;众妙之门 一、理论知识 回顾【深度】和【高度】的概念&#xff0c;现在主要还是写递归2&#xff09; 初识【回溯】3&#xff09;左叶子的明确定义&#xff1a;节点A的左孩子不为空&#xff0c;且左孩子的左右孩子都为空&am…

Pytorch的可视化

1 使用 wandb进行可视化训练过程 本文章将从wandb的安装、wandb的使用、demo的演示进行讲解。 1.1 如何安装wandb&#xff1f; wandb的安装比较简单&#xff0c;在终端中执行如下的命令即可&#xff1a; pip install wandb在安装完成之后&#xff0c;我们需要&#xff0c;去…

猫头虎分享已解决Bug || Error: [Vue warn]: Unknown custom element: <my-component> ‍✨

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …

[C++]17:二叉树进阶

二叉树进阶 一.二叉搜索树&#xff1a;1.二叉搜索树的概念&#xff1a;2.二叉搜索树的实现---循环版本&#xff1a;1.二叉搜索树的基本结构&#xff1a;2.查找&#xff1a;3.插入&#xff1a;4.中序遍历&#xff1a;5.删除&#xff1a; 3.二叉搜索树的实现---递归版本&#xff…

Python数据科学:Scikit-Learn机器学习

4.1Scikit-Learn机器学习 Scikit-Learn使用的数据表示&#xff1a;二维网格数据表 实例1&#xff1a;通过Seaborn导入数据 def skLearn():scikit Learn基本介绍:return:import seaborn as sns#导入Iris数据集#注&#xff1a;一般网络访问不了iris sns.load_dataset(iris)ir…

ubuntu服务器部署gitlab docker并配置nginx反向代理https访问

拉取镜像 docker pull gitlab/gitlab-ce运行容器 docker run --detach \--publish 9080:80 --publish 9022:22 --publish 9443:443\--namegitlab \--restartalways \--volume /home/docker/gitlab/config:/etc/gitlab \--volume /home/docker/gitlab/logs:/var/log/gitlab \-…

Linux_文件系统

假定外部存储设备为磁盘&#xff0c;文件如果没有被使用&#xff0c;那么它静静躺在磁盘上&#xff0c;如果它被使用&#xff0c;则文件将被加载进内存中。故此&#xff0c;可以将文件分为内存文件和磁盘文件。 内存文件 磁盘文件 软、硬链接 一.内存文件 1.1 c语言的文件接口 …

C/C++内存管理:new、delete功能及原理实现

目录 一、C/C内存分布 二、C中内存管理方式 2.1new/delete操作内置类型 2.2 new和delete操作自定义类型 三、operator new与operator delete函数 四、new和delete的实现原理 4.1内置类型 4.2自定义类型 五、定位new 一、C/C内存分布 int globalVar 1; static int sta…