首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >每天一道leetcode-392判断子序列

每天一道leetcode-392判断子序列

作者头像
乔戈里
发布2019-01-09 10:47:38
7090
发布2019-01-09 10:47:38
举报
文章被收录于专栏:Java那些事Java那些事Java那些事

392_(判断子序列)Is Subsequence

1 问题描述、输入输出与样例

1.1 问题描述

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。 你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

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

1.2 输入与输出

输入:

  • string s:给定的字符串 s
  • string t:给定的字符串 t

输出:

  • bool:判断 s 是否为 t 的子序列

1.3 样例

1.3.1 样例1

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

1.3.2 样例2

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

2 思路描述与代码

2.1 思路描述(双下标法)

i为字符 s 的遍历下标, j 表示字符 t 的遍历下标

for( j = 0; j < len_t; j++ ){
    if(s[i] == t[j]){
        if(i == len_s - 1) return true;
        else i++;
    }
}

比如输入: s = "abc", t = "ahbgdc"; j = 0, i = 0, s[0] == t[0], i = 1; j = 1, i = 1, s[1] != t[1]; j = 2, i = 1, s[1] == t[2], i = 2; j = 3, i = 2, s[1] != t[3]; j = 4, i = 2, s[2] != t[4]; j = 5, i = 2, s[2] == t[5], 返回true;

2.2 代码

bool isSubsequence(string s, string t) {
    int len_s = s.size();
    int len_t = t.size();
    //边界情况
    if(len_s > len_t) return false;
    else if(len_s == 0) return true;

    //遍历t
    int i = 0, j = 0;
    for( j = 0; j < len_t; j++ ){
        //如果当前字符相等,查找 s 的下一个字符是否在 t 中
        if(s[i] == t[j]){
            if(i == len_s - 1) return true;
            else i++;
        }
    }
    return false;
}

3 思考与拓展

3.1 思考

本题按照子序列的定义并利用双下标法可以很容易解决。

3.1.1 其他方法

无。

3.1.2 复杂度分析

方法

空间复杂度

时间复杂度

双下标法

O(1)

O(s_len+t_len)

3.1.3 难点分析
  1. i下标的更新。

3.2 拓展

如果给你的是数组数据呢?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员乔戈里 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 392_(判断子序列)Is Subsequence
  • 1 问题描述、输入输出与样例
    • 1.1 问题描述
      • 1.2 输入与输出
        • 1.3 样例
          • 1.3.1 样例1
          • 1.3.2 样例2
      • 2 思路描述与代码
        • 2.1 思路描述(双下标法)
          • 2.2 代码
          • 3 思考与拓展
            • 3.1 思考
              • 3.1.1 其他方法
              • 3.1.2 复杂度分析
              • 3.1.3 难点分析
            • 3.2 拓展
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档