完整教程:经典字符串与数组题目

news/2025/10/9 16:43:21/文章来源:https://www.cnblogs.com/wzzkaifa/p/19131427

目录

一、718. 最长重复子数组

二、712. 两个字符串的最小ASCII删除和

三、97. 交错字符串

 四、10. 正则表达式匹配 

五、7. 整数反转

六、8. 字符串转换整数 (atoi)

七、44. 通配符匹配

八、115. 不同的子序列

总结 


在 LeetCode 的算法世界里,字符串和数组类题目是基础且高频的考点,从简单到困难层层递进,考验着我们的逻辑思维与代码功底。今天我们就来逐一拆解上图中的几道经典题目,从解题思路到 C++ 代码实现,带你吃透这些考点。

一、718. 最长重复子数组

解题思路

这道题可以用动态规划来解决。定义  dp[i][j]  表示以  nums1[i-1]  和  nums2[j-1]  结尾的最长重复子数组的长度。

- 若  nums1[i-1] == nums2[j-1] ,则  dp[i][j] = dp[i-1][j-1] + 1 ;
- 否则  dp[i][j] = 0 。
最终遍历  dp  数组找到最大值即可。

C++ 代码实现

class Solution {
public:
int findLength(vector& nums1, vector& nums2) {
int m = nums1.size(), n = nums2.size();
vector> dp(m + 1, vector(n + 1, 0));
int maxLen = 0;
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (nums1[i - 1] == nums2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
maxLen = max(maxLen, dp[i][j]);
} else {
dp[i][j] = 0;
}
}
}
return maxLen;
}
};

二、712. 两个字符串的最小ASCII删除和


解题思路

同样采用动态规划。定义  dp[i][j]  表示使  s1[0..i-1]  和  s2[0..j-1]  相等所需删除字符的最小 ASCII 和。

- 若  s1[i-1] == s2[j-1] ,则  dp[i][j] = dp[i-1][j-1] ;
- 否则  dp[i][j] = min(dp[i-1][j] + s1[i-1], dp[i][j-1] + s2],-1]) 。

C++ 代码实现

class Solution {
public:
int minimumDeleteSum(string s1, string s2) {
int m = s1.size(), n = s2.size();
vector> dp(m + 1, vector(n + 1, 0));
for (int i = 1; i <= m; ++i) {
dp[i][0] = dp[i - 1][0] + s1[i - 1];
}
for (int j = 1; j <= n; ++j) {
dp[0][j] = dp[0][j - 1] + s2[j - 1];
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (s1[i - 1] == s2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1];
} else {
dp[i][j] = min(dp[i - 1][j] + s1[i - 1], dp[i][j - 1] + s2], - 1]);
}
}
}
return dp[m][n];
}
};

三、97. 交错字符串


解题思路

动态规划求解。定义  dp[i][j]  表示  s1  的前  i  个字符和  s2  的前  j  个字符能否交错组成  s3  的前  i+j  个字符。

- 若  s1[i-1] == s3[i+j-1] ,则  dp[i][j] = dp[i][j] || dp[i-1][j] ;
- 若  s2[j-1] == s3[i+j-1] ,则  dp[i][j] = dp[i][j] || dp[i][j-1] 。

C++ 代码实现

class Solution {
public:
bool isInterleave(string s1, string s2, string s3) {
int m = s1.size(), n = s2.size();
if (m + n != s3.size()) return false;
vector> dp(m + 1, vector(n + 1, false));
dp[0][0] = true;
for (int i = 1; i <= m; ++i) {
dp[i][0] = dp[i - 1][0] && (s1[i - 1] == s3[i - 1]);
}
for (int j = 1; j <= n; ++j) {
dp[0][j] = dp[0][j - 1] && (s2[j - 1] == s3[j - 1]);
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
dp[i][j] = (dp[i - 1][j] && s1[i - 1] == s3[i + j - 1]) ||
(dp[i][j - 1] && s2[j - 1] == s3[i + j - 1]);
}
}
return dp[m][n];
}
};

 四、10. 正则表达式匹配 


解题思路

这道题是动态规划的经典难题。定义  dp[i][j]  表示  s  的前  i  个字符和  p  的前  j  个字符是否匹配。

- 若  p[j-1] != '*' :若  s[i-1]  和  p[j-1]  匹配(相等或  p[j-1] == '.' ),则  dp[i][j] = dp[i-1][j-1] ;
- 若  p[j-1] == '*' :
- 不使用  '*'  前面的字符: dp[i][j] = dp[i][j-2] ;
- 使用  '*'  前面的字符(需  s[i-1]  和  p[j-2]  匹配): dp[i][j] = dp[i-1][j] 。

C++ 代码实现

class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size(), n = p.size();
vector> dp(m + 1, vector(n + 1, false));
dp[0][0] = true;
for (int j = 2; j <= n; ++j) {
dp[0][j] = dp[0][j - 2] && (p[j - 1] == '*');
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (p[j - 1] != '*') {
if (s[i - 1] == p[j - 1] || p[j - 1] == '.') {
dp[i][j] = dp[i - 1][j - 1];
}
} else {
dp[i][j] = dp[i][j - 2];
if (s[i - 1] == p[j - 2] || p[j - 2] == '.') {
dp[i][j] = dp[i][j] || dp[i - 1][j];
}
}
}
}
return dp[m][n];
}
};

五、7. 整数反转


解题思路

反转整数时需要注意溢出问题。我们可以通过逐位取出原数的最后一位,然后拼接到结果的末尾,同时在每一步判断是否溢出。

C++ 代码实现

class Solution {
public:
int reverse(int x) {
long long res = 0;
while (x != 0) {
int digit = x % 10;
x /= 10;
res = res * 10 + digit;
if (res > INT_MAX || res < INT_MIN) {
return 0;
}
}
return (int)res;
}
};

六、8. 字符串转换整数 (atoi)


解题思路

需要处理空格、符号、数字、非数字字符以及溢出情况。步骤如下:

1. 跳过前导空格;
2. 处理符号;
3. 逐个字符转换为数字,同时判断溢出。

C++ 代码实现

class Solution {
public:
int myAtoi(string s) {
int n = s.size();
int i = 0;
while (i  INT_MAX) {
return INT_MAX;
}
if (res * sign < INT_MIN) {
return INT_MIN;
}
i++;
}
return res * sign;
}
};

七、44. 通配符匹配


解题思路

使用动态规划。定义  dp[i][j]  表示  s  的前  i  个字符和  p  的前  j  个字符是否匹配。

- 若  p[j-1] == '*' : dp[i][j] = dp[i-1][j] || dp[i][j-1] ( '*'  匹配多个字符或空字符);
- 否则,若  s[i-1] == p[j-1]  或  p[j-1] == '?' ,则  dp[i][j] = dp[i-1][j-1] 。

C++ 代码实现

class Solution {
public:
bool isMatch(string s, string p) {
int m = s.size(), n = p.size();
vector> dp(m + 1, vector(n + 1, false));
dp[0][0] = true;
for (int j = 1; j <= n; ++j) {
if (p[j - 1] == '*') {
dp[0][j] = dp[0][j - 1];
}
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (p[j - 1] == '*') {
dp[i][j] = dp[i - 1][j] || dp[i][j - 1];
} else if (s[i - 1] == p[j - 1] || p[j - 1] == '?') {
dp[i][j] = dp[i - 1][j - 1];
}
}
}
return dp[m][n];
}
};

八、115. 不同的子序列


解题思路

动态规划求解。定义  dp[i][j]  表示  s  的前  i  个字符中包含  t  的前  j  个字符作为子序列的个数。

- 若  s[i-1] == t[j-1] ,则  dp[i][j] = dp[i-1][j-1] + dp[i-1][j] ;
- 否则  dp[i][j] = dp[i-1][j] 。

C++ 代码实现

class Solution {
public:
int numDistinct(string s, string t) {
int m = s.size(), n = t.size();
vector> dp(m + 1, vector(n + 1, 0));
for (int i = 0; i <= m; ++i) {
dp[i][0] = 1;
}
for (int i = 1; i <= m; ++i) {
for (int j = 1; j <= n; ++j) {
if (s[i - 1] == t[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return (int)dp[m][n];
}
};

总结 

以上八道题目覆盖了字符串与数组类题目的多种核心解法,尤其是动态规划的大量应用。通过理解这些题目的解题思路和代码实现,相信大家在面对类似问题时能更加游刃有余。刷题之路道阻且长,坚持总结与思考,终能攻克一座座算法高峰!

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

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

相关文章

2025钣金加工厂家最新推荐榜:精密工艺与定制服务口碑之选

钣金加工厂家最新推荐榜:精密工艺与定制服务口碑之选随着制造业转型升级步伐加快,钣金加工行业正迎来新一轮技术变革。作为制造业的基础工艺,钣金加工的质量直接影响到产品的结构强度、外观精度和使用寿命。在众多钣…

完整教程:Real-Time MDNet

完整教程:Real-Time MDNetpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", …

python查询数据信息,分析前了解表格结构

import pandas as pd file_path = rC:\Users\admin\OneDrive - nishbd.org\桌面\BMW sales data.csv df= pd.read_csv(file_path) print(df.describe()) #查询各列基本信息:计数、均值、标准差等 prin…

【SETUP】To debug the Neoverse N2 reference firmware

【SETUP】To debug the Neoverse N2 reference firmware ### Install repo tools https://mirrors.tuna.tsinghua.edu.cn/help/git-repo/### Test With FVP https://learn.arm.com/learning-paths/servers-and-cloud-…

减少磁盘延迟的方法

假设要连续读取234扇区 磁头读取一块的内容后,需要一小段时间处理,而盘片又在不停旋转 因此如果2,3号扇区相邻排列,则读完2号扇区后无法连续不断读如3号扇区 必须等待盘片继续旋转,3号扇区再次划过磁头才能完成扇区…

AutoCAD 2025 CAD 安装包中文永久免费免激活破解版下载 附图文安装教程

一、软件下载链接软件名称 CAD2025软件大小 2.69G安装环境 Win10以及以上 下载链接: 夸克:https://pan.quark.cn/s/8de31f21159b 迅雷:https://pan.xunlei.com/s/VOb746jRxzQSFI5JyTNSVtg0A1?pwd=nsha# 软件介绍:…

nmcli修改ip地址

1. 查看现有配置nmcli connection show/nmcli con show 2. 配置ip地址sudo nmcli con mod 788fee99-bd02-350f-98e7-37a676a2f5cd ipv4.addresses 192.168.8.68/24 ipv4.gateway 192.168.8.1 ipv4.dns 8.8.8.8 ipv4.me…

静态库与动态库:开发者必知的底层逻辑与实践技巧

在软件开发的日常工作中,库文件如同隐形的基石,支撑着代码的复用与项目的高效构建。但不少开发者在面对静态库与动态库时,常会陷入“知其然不知其所以然”的困境。本文将从底层逻辑出发,拆解两种库的核心差异,结合…

从C到pwn入门

前言 实在是非常想再开一次入门课,因为有一个自己觉得还挺巧妙的小想法:我能不能写一个C程序,它不调用后门函数,而是我自己用栈溢出去调用完成getshell。我想从开发的角度,而非从计算机的底层来理解我自己学习到的…

基于MATLAB的三轴航天器姿态控制的仿真

基于MATLAB的三轴航天器姿态控制的仿真。包含了动力学模型、控制器设计和仿真分析。 1. MATLAB仿真 %% 三轴航天器姿态控制系统仿真 % 作者:基于MATLAB的航天器控制仿真 clear; close all; clc;%% 航天器参数设置 J =…

golang基础语法(四) 数组 - 教程

golang基础语法(四) 数组 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco&…

for循环s.length()-1,s为空时的一直执行循环的问题

以下代码输出test2,如果没有break,会一直运行1 #include <bits/stdc++.h>2 using namespace std;3 4 int main() {5 int i;6 string s = "";7 int len = s.length() - 1;8 for (i =…

自适应工作负载的智能系统构建技术解析

本文深入探讨了基于机器学习的实例优化技术如何使数据库系统自动适应工作负载和数据特征,介绍了三种自调整方法及其在数据仓库服务中的实际应用,包括查询优化器改进和创新排序算法等核心技术。实例优化:让系统自动适…

aardio获取exe路径

aardio获取exe路径mainForm.msgbox(io.localpath("~","path")) mainForm.show();文件路径

分布式系统学习(一):相关概念及理论

概念 集群 相当于很多人一起 做一样的事一个业务模块,部署在多台服务器上分布式 相当于很多人一起,做不一样的事,这些事情合起来是一件大事;也就是变成了流水线工作一个大的业务系统,拆分成多个小的业务模块,分别…

一文读懂AI Agent:为什么说它是大模型的下一站?

一文读懂AI Agent:为什么说它是大模型的下一站?你是否曾经幻想过,有一个数字助手能像真人一样帮你处理任务?你只需要说一句“帮我规划一个国庆旅行的行程和预算”,它就能自动查机票、订酒店、排路线,甚至给你列出…

AI元人文构想的新启发:从自动驾驶困境到通用价值智能的构建——声明Ai研究

AI元人文构想的新启发:从自动驾驶困境到通用价值智能的构建——声明Ai研究 一、引言:自动驾驶困境与价值智能的觉醒 在科技发展的长河中,初代自动驾驶系统的车祸现场不仅是一次技术故障,更是一场哲学范式的溃败。当…

oracle存储过程编译以后要不要提交

oracle存储过程编译以后要不要提交在 Oracle 中,存储过程(Procedure)、函数(Function)、包(Package)等 编译后不需要手动提交。原因如下:一、DDL 与 PL/SQL 的提交规则存储过程、函数、包等属于 DDL 对象Oracl…

mido配置 DNS 服务器

这个错误仍然是 DNS 解析失败导致的,Docker 无法解析阿里云镜像仓库的域名 registry.cn-hangzhou.aliyuncs.com。可以按以下步骤彻底解决 DNS 问题: 检查并恢复 systemd-resolved 服务(推荐方法): 确保 systemd-r…

牛客周赛 Round 112

(0条未读通知) 牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ 国庆中秋玩后第一场vp,选择了一个比较简单的周赛,兴许是想挑软柿子捏🤭,写了5题还行,做个总结,一步一步恢复状态。 这场的D是个…