yankewei / LeetCode

LeetCode 问题的解决方法
MIT License
6 stars 0 forks source link

392. 判断子序列 #49

Open yankewei opened 4 years ago

yankewei commented 4 years ago

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

你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。

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

示例 1:

s = "abc", t = "ahbgdc"

返回 true.

示例 2:

s = "axc", t = "ahbgdc"

返回 false.

后续挑战 :

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/is-subsequence

yankewei commented 4 years ago

双指针

两个指针ij, i指向s头,j指向t头,当s中的字符在t中找到之后,i++并且j++,否则就只有j++。遍历的过程中当i == len(s)即返回true。

Go
func isSubsequence(s string, t string) bool {
    i, j, sLen, tLen := 0, 0, len(s), len(t)
    for i < sLen && j < tLen {
    if s[i] == t[j] {
        i++
    }
    j++
    }
    return i == sLen
}

优化版本

其实可以不用双指针,只需要遍历t字符串即可。

func isSubsequence(s string, t string) bool {
    i, sLen := 0, len(s)
    for index, _ := range t {
    if i == sLen {
        break
    }
        if t[index] == s[i] {
        i++
        }
    }
    return i == sLen
}