思路:双指针,如果相等后移,如果不相等长串(父串)后移
如果字串到头,返回true;如果父串到头,返回fasle;
class Solution {
public:
bool isSubsequence(string s, string t) {
int i,j;
for(i=0,j=0;i<s.size()&&j<t.size();)
{
if(s[i]==t[j]) {
i++;
j++;
}
else j++;
}
if(i==s.size()) return true;
else return false;
}
};
进阶
如果一系列的s串,判断是否是子序列
可以用unordered_map<char,vector>来记录t串中某个字符出现的位置。
比如说s=“abc”
需要匹配a,则去寻找memo[‘a’]中的最小的那个索引
匹配了ab,需要匹配c,则去寻找memo[‘c’]中符合条件(索引比b所对应的索引大)的最左侧的索引即可。
class Solution {
public:
unordered_map<char,vector<int>> memo;
bool isSubsequence(string s, string t) {
for(int i=0;i<t.size();i++){
memo[t[i]].push_back(i);
}
int pre=-1;
for(int i=0;i<s.size();i++){
int left=0,right=memo[s[i]].size();
while(left<right){
int mid=(left+right)/2;
if(memo[s[i]][mid]<=pre)
left=mid+1;
else if(memo[s[i]][mid]>pre) right=mid;
}//二分查找寻找左边界
if(left==memo[s[i]].size()) return false;
else pre=memo[s[i]][left];
}
return true;
}
};