前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 392. 判断子序列(双指针&二分查找)

LeetCode 392. 判断子序列(双指针&二分查找)

作者头像
Michael阿明
发布2020-07-13 16:12:57
8660
发布2020-07-13 16:12:57
举报

1. 题目

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

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

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

代码语言:javascript
复制
示例 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++
代码语言:javascript
复制
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时,应将所有字符的下标存进表里,进行二分查找,提高效率 二分查找参考

代码语言:javascript
复制
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];
    			else
    				R = mid-1;
    		}
    		else if(v[mid] < pos)
    			L = mid+1;
    	}
    	return -1;
    }
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
    • 2.1 双指针
      • 2. 二分查找
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档