Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、问题描述
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
题目链接:判断子序列。
二、题目要求
示例 1
输入: s = "abc", t = "ahbgdc"
输出: true
示例 2
输入: s = "axc", t = "ahbgdc"
输出: false
考察
1.动态规划中等题型,双指针问题,一题多解
2.建议用时15~30min
三、问题分析
1.双指针
这一题询问的是子序列问题,要求子序列可以不连续,但s出现的字符在t中也要有,顺序不能搞乱。接下来,用双指针搞定这一题:
1.初始化i j 两个指针指向s t 的初始位置,即下标为0
2.如果i j 指向的字符相等,则i++,j++
3.不相等i不变,j++,寻找下一个相等的位置
4.只有i的指针到末尾,才能证明s是t的子序列
2.动态规划
这一题,虽然官方将它分到了动态规划这一栏,其实用动态规划做的话,不仅代码多,还比较复杂,并没有体现动态规划的优势。我截个代码图,给你看看:
和下面的双指针是不是没得比,今天动态规划这三步,我们就不打了!
四、编码实现
bool isSubsequence(string s, string t) {
int i,j,m=s.size(),n=t.size();//初始化定义
i=j=0;//两个指针都在开头开始
while(i<m&&j<n)//不超过字符串范围
{
if(s[i]==t[j])//出现字符相等
{
i++;//指针同时后移
j++;
}
else
j++;//否则j指针单独移动
}
return i==m;//i指针到了末尾,判断成功
}
五、测试结果
六、动态规划入门总结
从算法题每日一练第34天开始到44天结束,这期间对力扣上面的简单题选取了10多个具有代表性的题目讲解,接下来打算刷位运算的题目,动态规划的相关题目链接如下:
初识动态规划:
入门学习:
- 算法题每日一练---第35天: 机器人走迷宫
- 算法题每日一练---第36天:连续子数组的最大和
- 算法题每日一练---第37天:打家劫舍
- 算法题每日一练---第38天:爬楼梯的最少成本
- 算法题每日一练---第39天:买卖股票的最佳时机
- 算法题每日一练---第40天:按摩师
- 算法题每日一练---第41天:三角形最小路径和
- 算法题每日一练---第42天:比特位计数
- 算法题每日一练---第43天:获取生成数组中的最大值
专栏:算法题每日一练