算法题每日一练---第44天:判断子序列

416 阅读2分钟

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.动态规划

这一题,虽然官方将它分到了动态规划这一栏,其实用动态规划做的话,不仅代码多,还比较复杂,并没有体现动态规划的优势。我截个代码图,给你看看:

2.png

5.png

和下面的双指针是不是没得比,今天动态规划这三步,我们就不打了!

四、编码实现

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指针到了末尾,判断成功
    }

五、测试结果

3.png

1.png

六、动态规划入门总结

从算法题每日一练第34天开始到44天结束,这期间对力扣上面的简单题选取了10多个具有代表性的题目讲解,接下来打算刷位运算的题目,动态规划的相关题目链接如下:

初识动态规划

入门学习

专栏算法题每日一练