1. 题目

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

你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。

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

示例 1:
s = "abc", t = "ahbgdc"
返回 true.示例 2:
s = "axc", t = "ahbgdc"
返回 false.

后续挑战 :
如果有大量输入的 S,称作S1, S2, … , Sk 其中 k >= 10亿,你需要依次检查它们是否为 T 的子序列。在这种情况下,你会怎样改变代码?

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/is-subsequence
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

2.1 双指针

  • 双指针分别 i, j 指向 s, t
  • s[i] == t[j] 时,才 i++
class Solution {public:bool isSubsequence(string s, string t) {if(s.size() > t.size())return false;int i = 0, j = 0;for( ; i < s.size() && j < t.size(); ++j){if(s[i] == t[j])i++;}return (i==s.size());}
};

2. 二分查找

当有大量的字符串s时,应将所有字符的下标存进表里,进行二分查找,提高效率
二分查找参考

class Solution {int L, R, mid;
public:bool isSubsequence(string s, string t) {if(s.size() > t.size())return false;vector<vector<int>> m(26);//存储t中字符对应的位置int i, j = 0;for(i = 0; i < t.size(); ++i){m[t[i]-'a'].push_back(i);//将t对应字符的下标存进数组}for(i = 0; i < s.size() && j < t.size(); ++i){j = binarysearch(m[s[i]-'a'], j);//对s中的字符在对应的t的数组里,查找大于等于j的位置if(j == -1)//没找到,返回错误return false;j++;//找到了,下次查找开始的位置+1}return (i==s.size());}int binarysearch(vector<int>& v, int &pos)//找值>=pos的第一个{L = 0, R = v.size()-1;while(L <= R){mid = L+((R-L)>>1);if(v[mid] >= pos){if(mid==0 || v[mid-1] < pos)return v[mid];elseR = mid-1;}else if(v[mid] < pos)L = mid+1;}return -1;}
};

LeetCode 392. 判断子序列(双指针二分查找)相关推荐

  1. leetcode - 392. 判断子序列

    392. 判断子序列 -------------------------------------------- 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅 ...

  2. Leetcode 392.判断子序列

    Time: 20190904 Type: Easy 题目描述 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~ ...

  3. Leetcode 392. 判断子序列 (每日一题 20210929)

    给定字符串 s 和 t ,判断 s 是否为 t 的子序列.字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串.(例如,"ace"是&q ...

  4. 118. Leetcode 392. 判断子序列 (动态规划-子序列问题)

    步骤一.确定状态: 确定dp数组及下标含义 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子 序列的长度为dp[i][j]. 步骤二.推断状态方程: 在确定递 ...

  5. LeetCode 392 判断子序列

    思路:动态规划 如果s长度>t长度,则返回假 否则求最长公共子序列,如果最长公共子序列长度为s的长度,返回真,否则为假 问题转化为求s,t的最长公共子序列 定义dp数组: dp[i][j]表示  ...

  6. Leetcode 392. 判断子序列 解题思路及C++实现

    解题思路: 使用贪心算法,每在字符串t中找到s的相应顺序的一个字符,就当做找到了该字符,然后接着去找后面的字符. 程序大循环:在字符串 t 中去寻找字符串 s 的第一个字符. 每当找到 s 的起始字符 ...

  7. 【Leetcode -389.找不同 -392.判断子序列】

    Leetcode Leetcode -389.找不同 Leetcode -392.判断子序列 Leetcode -389.找不同 题目:给定两个字符串 s 和 t ,它们只包含小写字母. 字符串 t ...

  8. python 判断子序列_LeetCode 392. 判断子序列 | Python

    392. 判断子序列 题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个 ...

  9. 392.判断子序列 | 792.匹配子序列的单词数

    392. 判断子序列 labuladong 题解思路 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成 ...

最新文章

  1. mybatis-嵌套(关联)查询/ N+1 / 延迟加载
  2. Android之项目推荐使用的第三方库
  3. ExtJs 入门 [窗体:Window组件]
  4. c# 调用oracle function,C#调用Oracle存储过程的方法
  5. 带UpdatePanel页面返回js问题
  6. mssql 无法启动调试器 数据为空_Windows无法启动:如何利用PE拯救桌面重要数据?...
  7. gd动态曲线 php_PHP 高级编程之多线程
  8. mysql where is_MySQL中条件放在where后面与放在on后面的区别
  9. freeMarker fmpp 解析PowerDesign PDM探索
  10. 电脑里的视频被误删了可以用EasyRecovery恢复吗?
  11. linux终端黑客帝国代码雨效果
  12. SQL数据库连接超时时间已到
  13. 为什么打印机打印照片模糊_我用打印机打印照片为什么不清楚?应该怎样调 – 手机爱问...
  14. 3 staruml 流程图,staruml流程图(staruml怎么画顺序图)
  15. 2022 社招 | 趋势科技 Linux开发 面经
  16. 远程移动测试平台对比分析
  17. 撸一个聊天室(vue+koa2+websokect+mongodb)
  18. 电流、电压、电阻、电容、电感的通俗理解
  19. Vertica 常用语法
  20. python中的连乘_python连乘

热门文章

  1. 数字信号处理的fpga实现_FPGA数字信号处理:通信类I/Q信号及产生
  2. python开源考试_可能是 Python 中最火的第三方开源测试框架 pytest
  3. c++远征之模板篇——标准模板库(STL)
  4. 树莓派安装CentOS
  5. 【洛谷比赛】你的名字。
  6. [转]命令行在IIS添加虚拟目录
  7. Linux使用技巧9--用dpkg管理你的软件
  8. 提交app时候90475,90474
  9. 进制A~Z,全字母26进制转化
  10. C#中用委托实现C++的回调函数