力扣392. 判断子序列

104 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

力扣392. 判断子序列

一、题目描述:

给定字符串 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

两个字符串都只由小写字符组成。

来源:力扣(LeetCode)

链接:leetcode.cn/problems/is…

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

这部分可以写写:

  1. 这道题考察了什么思想?你的思路是什么?

    我的思路很简单,因为我们要找的是s是不是t的子序列,只需要找到任何一种即可。我们同时遍历两个字符串,短的字符串指针为i,长的字符串指针为j。如果当i和j同时指到了同样的字母,就i和j同时右移。否则,只移动指针j。直到长的字符串遍历完毕,指针指到尾巴了。如果此时指针i的位置不是短字符串的长度,那么就s就不是t的子序列。如果指针i的位置与短字符串的长度相等,那么s就是t的子序列。

  2. 做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

    是一次通过的,我的思路比较简单,只需要简单编写代码即可。下面来看看大佬们的解法吧!

  3. 有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

    这种题目居然也能用动态规范!

    image-20220629173058711

 func isSubsequence(s string, t string) bool {
     n, m := len(s), len(t)
     f := make([][26]int, m + 1)
     for i := 0; i < 26; i++ {
         f[m][i] = m
     }
     for i := m - 1; i >= 0; i-- {
         for j := 0; j < 26; j++ {
             if t[i] == byte(j + 'a') {
                 f[i][j] = i
             } else {
                 f[i][j] = f[i + 1][j]
             }
         }
     }
     add := 0
     for i := 0; i < n; i++ {
         if f[add][int(s[i] - 'a')] == m {
             return false
         }
         add = f[add][int(s[i] - 'a')] + 1
     }
     return true
 }
 ​
 作者:LeetCode-Solution
 链接:https://leetcode.cn/problems/is-subsequence/solution/pan-duan-zi-xu-lie-by-leetcode-solution/
 来源:力扣(LeetCode)
 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三、AC 代码:

 class Solution {
 public:
     bool isSubsequence(string s, string t) {
         int i = 0, j = 0;
         while (i < s.length() && j < t.length()) {
             if (s[i] == t[j]) {
                 i++;
                 j++;
             }
             else j++;
         }
         if (i == s.length())return true;
         else return false;
     }
 };

四、总结:

如果你还有更多的思考、分析、总结,通通都加上来吧~

392. 判断子序列

这道题目用动态规范真的十分有趣,动态规划果然强大如斯!这里是小伞,欢迎每天来看看小伞的题解,和小伞一起进步哦!

写作模板来源:

作者:掘金酱 链接:juejin.cn/post/706970…

来源:稀土掘金

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。