392. 判断子序列

25 阅读1分钟

392. 判断子序列

简单

相关标签

premium lock icon相关企业

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace""abcde"的一个子序列,而"aec"不是)。

进阶:

如果有大量输入的 S,称作 S1, S2, ... , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

致谢:

特别感谢 ****@pbrother 添加此问题并且创建所有测试用例。

 

示例 1:

输入: s = "abc", t = "ahbgdc"
输出: true

示例 2:

输入: s = "axc", t = "ahbgdc"
输出: false

 

提示:

  • 0 <= s.length <= 100
  • 0 <= t.length <= 10^4
  • 两个字符串都只由小写字符组成。

题解:

边界处理没弄清楚,两层while循环,长串如果到结尾,匹配失败,但是子串也会一直到结尾,不能根据子串成功走到结尾判断成功。 而且长串走到结尾子串也到结尾,也有可能是刚刚好子串和长串最后一个匹配上。总的来说,应该要长串刚到达结尾,就检测子串是不是还没到结尾,这种才是唯一的失败条件,此时立刻break。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int sizes, sizet, i, j;
    char t[10000] = {'\0'};
    char s[100] = {'\0'};
    scanf("%s", s);
    scanf("%s", t);
    sizes = strlen(s);
    sizet = strlen(t);
    i = 0;
    j = 0;
    while (i <= sizes - 1)
    {
        while (j <= sizet - 1)
        {
            if (s[i] != t[j])
            {
                j ++;
            }
            else
            {
                j ++;
                break;
            }
        }
        i ++;
        if (j == sizet && i != sizes)
        {
            break;
        }
    }

    if (i == sizes)
    {
        printf("true");
    }
    else printf("false");

    return 0;
}