LeetCode 392. 判断子序列 【简单】

75 阅读1分钟

题干

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

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

题解 -- 双指针

时间复杂度O(n+m),n为s的长度,m为t的长度; 空间复杂度O(1)

import "fmt"

func isSubsequence(s string, t string) bool {
        // 双指针,i指向s,j指向t,初始时两个指针都指向字符串开头
	var i, j int
        // 遍历s,直到遍历到末尾退出
	for i < len(s) {
                // 对于s中每一个字符,在t中向后移动j寻找一个与它匹配的字符
		for j < len(t) && t[j] != s[i] {
			j++
		}
                // 如果在j移动到t的尾部之前找到了,那么就将i和j都向后移动,继续匹配下一个字符
                // 如果j移动到t的尾部之后还没找到,那么直接返回false
		if j < len(t) {
			i++
			j++
		} else {
			return false
		}
	}
	return true
}

func main() {
	var s, t = "abc", "ahbgdc"
	fmt.Println(isSubsequence(s, t))

	s, t = "axc", "ahbgdc"
	fmt.Println(isSubsequence(s, t))

}