题干
给定字符串 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))
}