该题我的第一思路比较简单,即直接在字符串t中循环寻找字符串s中的每个元素
法1:循环寻找
我们以字符串s为中心,去遍历字符串t,如果在字符串t中找到s[ 0 ]的话,我们将s[ 0 ]删除,且记录在字符串t中与s[ 0 ]相同的字符的下标,以便继续寻找(同时保证相对位置不变)
class Solution {
public:
bool isSubsequence(string s, string t) {
int lens = s.length();
int lent = t.length();
int index_next = -1, i = 0;//初始化
while (lens != 0 && i < lent)//字符串s的每个字符还没全被找到 并且 还没找遍t的全部字符
{
for (i = index_next + 1; i < lent; i++)//每次从上次找到的字符下标的下一个元素开始找
{
if (t[i] == s[0])
{
s.erase(s.begin());//删除
index_next = i;//记录在字符串t中与s[ 0 ]相同的字符的下标
lens--;//更新字符串s的长度
break;//退出寻找
}
}
if (index_next >= lent)//越界
{
break;
}
}
if (index_next >= lent|| lens != 0)//s字符没有全部被找到 或 已经找遍了t的全部字符
{
return false;
}
else
{
return true;
}
}
};
法2:双指针
其实思路与法1差不多,只不过不是通过删除的方式来更新寻找的元素,而是通过指针,且最后通过判断i是否越界即可知道是不是找到了所有元素(因为只有找到了,i才会更新)
class Solution {
public://双指针
bool isSubsequence(string s, string t) {
int i = 0, j = 0, lens = s.length(), lent = t.length();
while (i < lens && j < lent)//指针未越界
{
if (s[i] == t[j])//找到了
{
i++;//更新要寻找的元素
}
j++;//持续寻找(同时保持相对位置)
}
return i>=lens ? true : false;//最后通过判断i是否越界即可知道是不是找到了所有元素(因为只有找到了,i才会更新)
}
};