算法沉淀——字符串(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.mzph.cn/news/682092.shtml

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

相关文章

力扣hot1--哈希

推荐一个博客&#xff1a; 一文看懂哈希表并学会使用C STL 中的哈希表_哈希表end函数-CSDN博客 哈希做法&#xff1a; 我们将nums[i]记为key&#xff0c;将i记为value。 判断target-nums[i]是否在哈希表中&#xff0c;如果在说明这两个值之和为target&#xff0c;那么返回这两…

【seata自动化治愈数据库问题解决方案】

wu-database-lazy-seata-cure-plus-starter 描述 针对saas 数据库隔离情况下&#xff0c;每次版本迭代都需要重新修改对应的数据库&#xff0c;对于升级与运维存在一定的难度&#xff0c;那么这个数据库治愈框架来了&#xff0c;使用场景如下 1.数据库不存在自动创建数据库 …

剑指offer——旋转数组的最小数字

目录 1. 题目描述2. 分析思路2.1 示例分析 3. 更完美的做法 1. 题目描述 把一个数组最开始的若干个元素搬到数组的末尾&#xff0c;我们称之为数组的旋转。输入一个递增排序的数组的一个旋转&#xff0c;输出旋转数组的最小元素。例如数组{3.4,5,1.2}为{1.2,3,4,5}的一个旋转&a…

神经网络:卷积神经网络中的BatchNorm

一、BN介绍 1.原理 在机器学习中让输入的数据之间相关性越少越好&#xff0c;最好输入的每个样本都是均值为0方差为1。在输入神经网络之前可以对数据进行处理让数据消除共线性&#xff0c;但是这样的话输入层的激活层看到的是一个分布良好的数据&#xff0c;但是较深的激活层…

C语言——oj刷题——字符串左旋

问题&#xff1a; 实现一个函数&#xff0c;可以左旋字符串中的k个字符。 例如&#xff1a; ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 实现&#xff1a; 当我们谈到字符串左旋时&#xff0c;我们指的是将字符串中的字符向左移动一定数量的位置。这个问题在编程中…

揭秘某电商公司最新面试流程

&#x1f3c3;‍♂️ 微信公众号: 朕在debugger© 版权: 本文由【朕在debugger】原创、需要转载请联系博主&#x1f4d5; 如果文章对您有所帮助&#xff0c;欢迎关注、点赞、转发和订阅专栏&#xff01; 记录近期某电商公司面试流程及问题&#xff0c;分为三面&#xff1a;…

Hive的相关概念——分区表、分桶表

目录 一、Hive分区表 1.1 分区表的概念 1.2 分区表的创建 1.3 分区表数据加载及查询 1.3.1 静态分区 1.3.2 动态分区 1.4 分区表的本质及使用 1.5 分区表的注意事项 1.6 多重分区表 二、Hive分桶表 2.1 分桶表的概念 2.2 分桶表的创建 2.3 分桶表的数据加载 2.4 …

Android 11.0 framework中禁止某个无源码app使用分屏功能

1.前言 在11.0的系统rom定制化开发中,在app中多窗口模式中,分屏模式也是其中的一种模式,可以通过app内部设置分屏的属性,然后实现 app启动的时候分屏功能,在无源码的app中就没办法更改。就需要在安装的时候修改这个属性,接下来实现这个功能 2.framework中禁止某个无源码…

【计算机网络】网际协议——互联网中的转发和编址

编址和转发是IP协议的重要组件 就像这个图所示&#xff0c;网络层有三个主要组件&#xff1a;IP协议&#xff0c;ICMP协议&#xff0c;路由选择协议IPV4 没有选项的时候是20字节 版本&#xff08;号&#xff09;&#xff1a;4比特&#xff1a;规定了IP协议是4还是6首部长度&am…

作业2.14

指针练习 1、选择题 1.1、若有下面的变量定义&#xff0c;以下语句中合法的是&#xff08;A&#xff09;。 int i&#xff0c;a[10]&#xff0c;*p&#xff1b; A&#xff09; pa2; B&#xff09; pa[5]; C&#xff09; pa[2]2; D&#xff09; p&(i2); 1.2、…

Servlet JSP-Eclipse安装配置Maven插件

Maven 是一款比较常用的 Java 开发拓展包&#xff0c;它相当于一个全自动 jar 包管理器&#xff0c;会导入用户开发时需要使用的相应 jar 包。使用 Maven 开发 Java 程序&#xff0c;可以极大提升开发者的开发效率。下面我就跟大家介绍一下如何在 Eclipse 里安装和配置 Maven 插…

医疗相关名词,医疗名词整理

1.系统类&#xff1a; HIS Hospital Information System&#xff0c;医院信息系统&#xff0c;在国际学术界已公认为新兴的医学信息学(Medical Informatics)的重要分支。美国该领域的著名教授Morris.Collen于1988年曾著文为医院信息系统下了如下定义&#xff1a;利用电子计算…

【安装指南】markdown神器之Typora下载、安装与无限使用详细教程

&#x1f33c;一、概述 Typora是一款轻量级的Markdown编辑器&#xff0c;它提供了简洁的界面和直观的操作方式&#xff0c;专注于让用户更加专注于写作。Typora支持实时预览功能&#xff0c;用户在编辑Markdown文档时可以即时看到最终的样式效果&#xff0c;这有助于提高写作效…

P1506 拯救oibh总部---洪水填充问题(bfs解)

思路&#xff1a;因为中间部分如果是没被覆盖的&#xff0c;就是周围一定有****&#xff0c;这说明这个点一定与边界连不上&#xff0c;反过来想&#xff0c;从两边向中间延申&#xff08;如果是0的话&#xff09;&#xff0c;这样被填充的部分就是被淹没的部分 // Problem: …

ACP科普:敏捷开发之kanban

Q1: Kanban是什么&#xff1f; A1:敏捷开发中的Kanban是一种项目管理方法&#xff0c;其核心理念是通过可视化管理来提高生产效率和任务交付速度。Kanban来自日本&#xff0c;意为“看板”&#xff0c;最初是由丰田汽车公司引入生产线上的生产控制系统&#xff0c;后来被引入到…

Golang快速入门到实践学习笔记

Go学习笔记 1.基础 Go程序设计的一些规则 Go之所以会那么简洁&#xff0c;是因为它有一些默认的行为&#xff1a; 大写字母开头的变量是可导出的&#xff0c;也就是其它包可以读取 的&#xff0c;是公用变量&#xff1b;小写字母开头的就是不可导出的&#xff0c;是私有变量…

寒假学习记录11:grid布局

1. display:grid 2. grid-template-columns: 100px 100px 100px //指定每列的宽度 grid-template-rows: 100px 100px 100px //指定每行的宽度 3. column-gap: 24px //列间距 row-gap: 24px //行间距 gap: 24px //都设置 4.grid-template-areas用法 <!DO…

git错误整理

remote: Support for password authentication was removed on August 13, 2021. 参考&#xff1a;这篇即可 GnuTLS recv error (-110): The TLS connection was non-properly terminated. 执行下面的指令&#xff1a; git config --global http.sslVerify false

14.如果new一个箭头函数的会怎么样

箭头函数是ES6中的提出来的&#xff0c;它没有prototype&#xff0c;也没有自己的this指向&#xff0c;更不可以使用arguments参数&#xff0c;所以不能New一个箭头函数。 new操作符的实现步骤如下&#xff1a; 创建一个对象将构造函数的作用域赋给新对象&#xff08;也就是将…

蓝桥杯:日期统计讲解(C++)

日期统计 本题来自于&#xff1a;2023年十四届省赛大学B组真题 主要考察&#xff1a;暴力。 代码放在下面&#xff0c;代码中重要的细节全都写了注释&#xff0c;非常清晰明了&#xff1a; #include <bits/stdc.h> //万能头文件 using namespace std;int main() {…