【LeetCode】392. Is Subsequence(C++)

题目概述

大意就是给两个字符串s和t,判断s是否是t的子串(不要求s在t中连续),如果是返回true,如果不是返回false(原题链接
例如:

  • abc是ahbgde的子串
  • amc不是ahbgde的子串

难度级别:easy

解题思路

既然是判断s是否为t的子串,容易想到的就是拿s中每一个字符去跟t的字符进行比较,那么需要做的就是设置两个变量(可理解为指针),如下图所示:

  1. 初始化
    初始化
  2. 可以看出第一个字母即匹配成功,则同时移动指针i和指针j
    第一次匹配成功
  3. 从第二步可以看出,指针i所指(b)和指针j所指(h)不匹配,那么移动j直到匹配到相应字符或者到达字符串T边界停止
    移动指定j指定找到与i对应为相同字符停止
    移动第二次
    移动第三次
  4. 此例较为凑巧,移动至字符串T边界匹配成功
    匹配成功可以看出,我们需要做的就是每次固定指针i,通过移动指针t,即可判断s中到i截止的子串是否是t的子串,终止条件即为i遍历为完或者j遍历完(有且仅有以下三种情况:如果i遍历完,j未遍历完,那么匹配成功;如果i为遍历完,j遍历完,那么匹配不成功;如果i遍历完,j也遍历完,那么匹配成功)

代码

注意:代码1在LeetCode平台会报错,原因找了很久没找到,可能原因是时间复杂度太高,导致报Runtime Error,但在本地测试报错的输入时符合题意
代码1和代码2的主要区别在于判断指针移动的方式不同,代码1是直到找到s[i]==t[j]的情况下指针j才进行移动,然后指针i进行移动,即主要考虑指针j的移动代码2则是当找到相同字符后,两个指针同时进行移动,即主要考虑指针i和指针j的移动
PS:我也不知道为什么当时脑抽非要用代码1的思路,时间复杂度还高那么多,后来没办法一直报错,只能小改以下思考角度。。。

代码1(慎用)

bool isSubsequence(string s, string t) {
     if(s.empty()) return true;
         int i=0,j=0;
         bool flag = true;
         while(i < s.length() || j < t.length()){
             while(t[j] != s[i]){
                 j++;
                 if(j >= t.length()){
                     flag = false;
                     break;
                 }
             }
             i++;
             if(j < t.length()) j++;
             if(i >= s.length()) break;
         }
         return flag;
}
代码2(推荐)
bool isSubsequence(string s, string t) {
	if(s.empty()) return true;
       int i=0,j=0;
       bool flag = true;
       while(i < s.length() && j < t.length()){
           if(s[i] == t[j]){
           	i++;
           	j++;
		}else{
			j++;
		}
       }
       if(i == s.length()) return true;
       return false;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值