判断子序列
2020-05-21 本文已影响0人
WAI_f
题目:
给定字符串 s 和 t ,判断 s 是否为 t 的子序列。
你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。
字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。
示例:
s = "abc", t = "ahbgdc"
返回 true.
解题方法:
我的解题思路还是挺清楚的,就是依次判断s中字符是否在t中出现,查询过程中,不断更新在t中查询的起始索引,这样就可以保证不会每次遍历都从t的起始位置进行匹配,同时也减少了遍历的时间。但是代码写的非常难看,逻辑也比较乱,导致改了很多次才通过。
代码和结果:
class Solution {
public:
bool isSubsequence(string s, string t) {
int start=0;
if(s.empty())
return true;
if(t.empty())
return false;
int i;
for(i=0;i<s.size();i++)
{
while(start<t.size())
{
if(s[i]==t[start])
{
start++;
break;
}
else
{
start++;
}
}
if(start==t.size())
{
i++;
break;
}
}
if(start<t.size())
return true;
else if(i<s.size())
return false;
else if(s[i-1]!=t[start-1])
return false;
else
return true;
}
};
运行结果:

写这篇文章的时候突然想起来是不是可以用一个循环来完成这个程序,且编写起来应该要简单很多:
class Solution {
public:
bool isSubsequence(string s, string t) {
int i=0;
int j=0;
while(i<s.size()&&j<t.size())
{
if(s[i]==t[j])
{
i++;
j++;
}
else
{
j++;
}
}
if(i==s.size())
return true;
else
return false;
}
};
运行结果:

题目还是很简单的,思路也很清晰,不过写代码的时候还是要多想想,不然还是很容易出现逻辑漏洞,改起来挺烦的。