leetcode-392. 判断子序列

https://leetcode-cn.com/problems/is-subsequence/

双指针法

<?php
class Solution {
/**
* @param String $s
* @param String $t
* @return Boolean
*/
function isSubsequence($s, $t) {
$tLen = strlen($t);
$sLen = strlen($s);
$sLoc = 0;
for ($tLoc = 0; $tLoc < $tLen; $tLoc++) {
if ($sLoc >= $sLen) {
return true;
}
if ($t[$tLoc] == $s[$sLoc]) {
$sLoc++;
}
}
return $sLoc >= $sLen;
}
}

动态规划

/**
* @param String $s
* @param String $t
* @return Boolean
*/
function isSubsequence2($s, $t) {
// f[i][j] = f[i+1][j] i != j
// f[i][j] = i; i=j
// 动态规划,先计算出每一个字符后面最先出现另外一个字符
$dp = [];
for ($i = 0; $i < 26; $i ++) {
$dp[strlen($t)][$i] = strlen($t);
}
// 初始化一个二维数组,数组是 strlen($t) * 26 的二维数组
// 每一个元素的 $i 指 $t 字符串的第几个字符
// 每一元素的 $j 指从 $i 位置到 $j 位置
// 值为下一个 $j 位置的 index, 如果$i 位置就是 $j 那就是自己
for ($i = strlen($t) - 1; $i >= 0; $i--) {
for ($j = 0; $j < 26; $j++) {
if (ord($t[$i]) == $j) {
$dp[$i][$j] = $i;
} else {
$dp[$i][$j] = $dp[$i+1][$j];
}
}
}
$curIndex = 0;
for ($i = 0; $i < strlen($s); $i++) {
if ($dp[$curIndex][ord($s[$i])] == strlen($t)) {
return false;
} else {
$curIndex = $dp[$curIndex][ord($s[$i])] + 1;
}
}
return true;
}

动态规划的转移方程建议看一下官方题解,说的比较清楚

// f[i][j] = f[i+1][j]; i != j
// f[i][j] = i; i=j
posted @   吴丹阳-V  阅读(39)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
历史上的今天:
2020-06-13 超过经理收入的员工-leetcode
点击右上角即可分享
微信分享提示