尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

完整教程:经典字符串与数组题目
📅 发布时间:2026/6/19 19:46:17

目录

一、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];
}
};

总结 

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

相关新闻

  • 完整教程:Real-Time MDNet
  • AutoCAD 2025 CAD 安装包中文永久免费免激活破解版下载 附图文安装教程
  • nmcli修改ip地址

最新新闻

  • Onekey完整教程:一键解锁Steam游戏DLC的终极方案
  • 2026年南京知名3D效果图制作公司大盘点,你知道几家?
  • S12 MSCAN与SCI模块深度解析:低功耗、中断与安全初始化实战
  • MPV播放器懒人包:3分钟打造专业级视频播放体验
  • 2026年6月经验丰富的升降货梯生产公司哪家便宜,导轨式货梯升降机/厂房升降货梯/四柱液压货梯,升降货梯工厂平价推荐 - 品牌推荐师
  • 4.19周总结

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号