当前位置: 首页 > news >正文

392. Is Subsequence

题目描述

要通过这道题很容易,双指针法即可解决。进阶的问题很有意思。

class Solution {
public:bool isSubsequence(string s, string t) {int len_s = s.size();int len_t = t.size();int j = 0;for(int i = 0;j < len_s && i < len_t;i++){if(s[j] == t[i]){j++;}}return j==len_s;}
};

如果对大量的s字符串都按照上面的方法处理,显然是低效的。在t中查找下一个字符的操作耗费大量时间,每个新的s都要做这个重复的工作,这个事情本身只和t字符串自身的性质以及字符集有关,和s字符串无关。可以对t预处理,求出下一个字符的位置,每次只需要查询这个表即可。

具体看代码:

class Solution {
public:bool isSubsequence(string s, string t) {int len_t = t.size();//dp[i][j],0<=i<=len_t,0=<j<=25//dp[i][j]表示字符串t中从位置i开始往后字符j第一次出现的位置//如果dp[i][j]==len_t表示t中从位置i开始往后不存在字符j,因为t没有位置len_tvector<vector<int>> dp(len_t+1,vector<int>(26,len_t));//初始化只需要将dp[len_t][j] 0<=j<26 全部初始化为len_t就可以,表示字符串t末尾的后面没有字符//其他初始状态可以为任何值,可以不初始化//由于前面定义dp的时候已经把整个dp数组初始化为len_t,所以下面这两行可以省略// for(int j =0;j <26;j++)//     dp[len_t][j] = len_t;for(int i = len_t-1;i >=0;i--){//i必须从大到小遍历// for(int j = 0;j <26;j++){//j从大到小或者从小到大遍历都可以for(int j = 25;j>=0;j--){  //j从大到小或者从小到大遍历都可以if(t[i]-'a' == j){dp[i][j] = i;}else{dp[i][j] = dp[i+1][j];}}}int len_s = s.size();int i = 0;for(int k = 0;k < len_s;k++){if(dp[i][ s[k]-'a' ] == len_t)return false;else{i = dp[i][ s[k]-'a' ];i++;}}return true;}
};

相关文章:

  • linux线程基础
  • 摄影构图小节
  • Linux线程同步信号量
  • Vue-键盘事件
  • React学习(二)-变量
  • Centos7.9同步外网yum源至内网
  • 2025最新的软件测试面试大全(含答案+文档)
  • Java获取淘宝拍立淘API接口的详细指南
  • DeepSeek 大模型部署全指南:常见问题、优化策略与实战解决方案
  • 精益数据分析(64/126):移情阶段的用户触达策略——从社交平台到精准访谈
  • 开源项目实战学习之YOLO11:12.2 ultralytics-models-sam-decoders.py源码分析
  • 淘特入口无痕秒单怎么做的?
  • deepin v23.1 搜狗输入法next配置中文输入法下默认用英文标点
  • 如何在Cursor中高效使用MCP协议
  • [Java] 方法和数组
  • impala
  • 实验七 基于Python的数字图像水印算法
  • 【SpringBoot】MyBatisPlus(MP | 分页查询操作
  • CSP 2024 提高级第一轮(CSP-S 2024)单选题解析
  • Java异常、泛型与集合框架实战:从基础到应用
  • 人民网:激发博物馆创新活力,让“过去”拥有“未来”
  • 首届中国人文学科年度发展大会启幕,共话AI时代人文使命
  • 61岁云浮市律师协会副会长谭炳光因突发疾病逝世
  • 查幽门螺杆菌的这款同位素长期被海外垄断,秦山核电站实现突破
  • 2025年“新时代网络文明公益广告”征集展示活动在沪启动
  • 2000多年前的“新衣”长这样!马王堆文物研究新成果上新