题目链接:
题目分析:
给我们s,t俩个字符串,问是否可以通过删除t的一些字符得到s,其实换个方法就是说,s是否是t的子串,也就是说s是否是t的一个子集。
解题思路:
思路一:采用暴力法求解,求出t的所有子集,求子集的过程中,与s进行比较,如果碰到有相等的,那么就返回true
,如果子集都枚举完了,还没有找到与s相等的字串,就说明s不是t的字串返回false
.但是用这种方法,子集枚举的复杂度为O(2^n),复杂度过大。
思路二:我们可以用俩个指针i,j分别指向字符串s,t。
算法描述如下:j指针一直往后走,碰到s[i]==t[j]
的时候,说明匹配上了一个,将i++,j++
,否则 j++。当s 或者t 都走完的时候,这个时候,我们判断一下i指针是否走完了s字符串,如果走完了,说明也匹配上了,如果没有走完,那么就是没有匹配上。这个复杂度是O(t 的长度)。
AC代码如下:
class Solution {
public:
bool isSubsequence(string s, string t) {
int lenS = s.length();
int lenT = t.length();
int i = 0;
int j = 0;
while(i<lenS && j<lenT)
{
if(s[i]==t[j]){
i++;
j++;
}
else
j++;
}
if(i==lenS)
return true;
else
return false;
}
};