LeetCode 392. 判断子序列(双指针二分查找)
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. 判断子序列(双指针二分查找)相关推荐
- leetcode - 392. 判断子序列
392. 判断子序列 -------------------------------------------- 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅 ...
- Leetcode 392.判断子序列
Time: 20190904 Type: Easy 题目描述 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~ ...
- Leetcode 392. 判断子序列 (每日一题 20210929)
给定字符串 s 和 t ,判断 s 是否为 t 的子序列.字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串.(例如,"ace"是&q ...
- 118. Leetcode 392. 判断子序列 (动态规划-子序列问题)
步骤一.确定状态: 确定dp数组及下标含义 dp[i][j] 表示以下标i-1为结尾的字符串s,和以下标j-1为结尾的字符串t,相同子 序列的长度为dp[i][j]. 步骤二.推断状态方程: 在确定递 ...
- LeetCode 392 判断子序列
思路:动态规划 如果s长度>t长度,则返回假 否则求最长公共子序列,如果最长公共子序列长度为s的长度,返回真,否则为假 问题转化为求s,t的最长公共子序列 定义dp数组: dp[i][j]表示 ...
- Leetcode 392. 判断子序列 解题思路及C++实现
解题思路: 使用贪心算法,每在字符串t中找到s的相应顺序的一个字符,就当做找到了该字符,然后接着去找后面的字符. 程序大循环:在字符串 t 中去寻找字符串 s 的第一个字符. 每当找到 s 的起始字符 ...
- 【Leetcode -389.找不同 -392.判断子序列】
Leetcode Leetcode -389.找不同 Leetcode -392.判断子序列 Leetcode -389.找不同 题目:给定两个字符串 s 和 t ,它们只包含小写字母. 字符串 t ...
- python 判断子序列_LeetCode 392. 判断子序列 | Python
392. 判断子序列 题目 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 你可以认为 s 和 t 中仅包含英文小写字母.字符串 t 可能会很长(长度 ~= 500,000),而 s 是个 ...
- 392.判断子序列 | 792.匹配子序列的单词数
392. 判断子序列 labuladong 题解思路 给定字符串 s 和 t ,判断 s 是否为 t 的子序列. 字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成 ...
最新文章
- mybatis-嵌套(关联)查询/ N+1 / 延迟加载
- Android之项目推荐使用的第三方库
- ExtJs 入门 [窗体:Window组件]
- c# 调用oracle function,C#调用Oracle存储过程的方法
- 带UpdatePanel页面返回js问题
- mssql 无法启动调试器 数据为空_Windows无法启动:如何利用PE拯救桌面重要数据?...
- gd动态曲线 php_PHP 高级编程之多线程
- mysql where is_MySQL中条件放在where后面与放在on后面的区别
- freeMarker fmpp 解析PowerDesign PDM探索
- 电脑里的视频被误删了可以用EasyRecovery恢复吗?
- linux终端黑客帝国代码雨效果
- SQL数据库连接超时时间已到
- 为什么打印机打印照片模糊_我用打印机打印照片为什么不清楚?应该怎样调 – 手机爱问...
- 3 staruml 流程图,staruml流程图(staruml怎么画顺序图)
- 2022 社招 | 趋势科技 Linux开发 面经
- 远程移动测试平台对比分析
- 撸一个聊天室(vue+koa2+websokect+mongodb)
- 电流、电压、电阻、电容、电感的通俗理解
- Vertica 常用语法
- python中的连乘_python连乘