Is Subsequence

来源:互联网 发布:淘宝试用卖家不发货 编辑:程序博客网 时间:2024/05/18 03:07

Given a string s and a string t, check if s is subsequence of t.

You may assume that there is only lower case English letters in both s and t. t is potentially a very long (length ~= 500,000) string, and s is a short string (<=100).

A subsequence of a string is a new string which is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (ie, “ace” is a subsequence of “abcde” while “aec” is not).

Example 1:
s = “abc”, t = “ahbgdc”

Return true.

Example 2:
s = “axc”, t = “ahbgdc”

Return false.

Follow up:
If there are lots of incoming S, say S1, S2, … , Sk where k >= 1B, and you want to check one by one to see if T has its subsequence. In this scenario, how would you change your code?

#include<vector>#include<random>#include<stack>#include<sstream>#include<list>#include<iomanip>#include<numeric>#include<algorithm>#include<map>#include<cstdlib>#include<string>#include<cstring>#include<cstdio>#include<limits>#include<cmath>#include<deque>#include<iostream>#include<unordered_map>#include<unordered_set>#include<queue>using namespace std;    template<typename T>void pprintv(T arr){    for(int i=0;i<arr.size();++i)    {        cout<<arr[i]<<" ";    }    cout<<endl;}class Solution {public:    bool isSubsequence(string s, string t) {        if(s.empty())return true;        if(t.empty())return false;        int i=0;        int lent=t.size();        int lens=s.size();        for(int j=0;j<lent;++j)        {            if(t[j]==s[i])            {                ++i;                if(i==lens)return true;            }        }        return false;    }};

如果有很多要搜索的string s,可以用先建立string t的索引,然后对其进行binary search。

class Solution {public:    bool isSubsequence(string s, string t) {        //build a record to store the index of each char in t        vector<vector<int>> record(26);        //add indexs        for(int i = 0; i < t.size(); i++) {            record[t[i]-'a'].push_back(i);        }        //check if each char in s is in the legal place        int index = -1;        for(int i = 0; i < s.size(); i++) {            auto iter = upper_bound(record[s[i]-'a'].begin(), record[s[i]-'a'].end(), index);            if(iter == record[s[i]-'a'].end()) return false;            index = *iter;        }        return true;    }};
0 0
原创粉丝点击