判断字符串s是否为t的子序列,关键看s中字符能否在t中按序出现(不必连续);用双指针法:i遍历s,j遍历t,每匹配一个字符则i++,若i达s长度即成功,否则失败。

判断一个字符串是否为另一个字符串的子序列,关键在于字符是否按顺序出现,不要求连续。
子序列的定义要搞清
子序列是指从原字符串中删除若干(可以是零个)字符,不改变剩余字符相对位置所得到的新字符串。比如 "ace" 是 "abcde" 的子序列,但 "aec" 不是——因为 'e' 在 'c' 之后出现,顺序错了。
双指针法最直观高效
用两个指针分别遍历 s(子序列候选)和 t(主字符串):
- 初始化 i = 0(指向 s),j = 0(指向 t)
- 遍历 t:若 s[i] === t[j],则 i++(匹配上一个字符)
- 只要 i 走到 s 末尾(即 i === strlen(s)),说明全部字符按序匹配成功
- 遍历完 t 但 i 还没到末尾,就返回 false
PHP 实现示例
注意边界处理和类型一致性(PHP 中字符串下标支持,strlen 安全):
立即学习“PHP免费学习笔记(深入)”;
function isSubsequence($s, $t) {
$i = 0;
$lenS = strlen($s);
if ($lenS === 0) return true; // 空字符串是任意字符串的子序列
for ($j = 0; $j < strlen($t); $j++) {
if ($s[$i] === $t[$j]) {
$i++;
if ($i === $lenS) return true;
}
}
return false;
}
常见易错点提醒
- 别混淆“子序列”和“子串”——子串必须连续,子序列只需保序
- 空字符串 "" 是任何字符串的子序列,需单独或自然覆盖(上面代码中 strlen=0 直接返回 true)
- PHP 中用 $s[$i] 取字符是安全的(自动转为字符串索引),无需 str_split
- 避免用 strpos 循环查找——它每次从头找,可能跳过前面已用过的字符,逻辑易错











