您的位置:首页 > 产品设计 > UI/UE

LeetCode 392. Is Subsequence 题解——Java

2017-03-14 22:30 323 查看
题目链接:https://leetcode.com/problems/is-subsequence/#/description

题目要求:判断字符串s是不是字符串t的子序列

方法一:

首先想到的方法是,使用两个队列分别保存两个字符串中的各个字符,依次比较队首元素,若两个队列的队首元素相同,则表示到目前为止,s的前x个字符可以匹配为t的子序列;如果两个队列的队首元素不相同,则将t队列的首元素出队列,继续比较.......当两个队列中有一个队列为空时,上述比较结束,此时判断s队列是否为空,若为空表示s的各个字符都匹配到了t中的字符,因此s是t的子序列;若s队列不为空,表示s字符串中有某些字符没有办法和t字符串无法匹配,因此s不是t的子序列。

Java代码如下:

public class Solution {
// 判断s是否是t的子序列
public boolean isSubsequence(String s, String t) {
// 将s和t入队列(不直接操作string的原因是,如果在字符串最前面删除一个元素,那么后面的元素都需要向前移动,效率很低)
Queue<Character> sQueue = new LinkedList<Character>();
Queue<Character> tQueue = new LinkedList<Character>();
for (int i = 0; i < s.length(); i++) {
sQueue.add(s.charAt(i));
}
for (int i = 0; i < t.length(); i++) {
tQueue.add(t.charAt(i));
}

Character sFirst = null;
Character tFirst = null;
// 依次比较两个队列的首元素,如果两队列首元素相同,两个队列的首元素都出队列,继续比较余下的子串
// 如果两队列首元素不同,s队列不动,t队列首元素出队列,继续比较...
while (sQueue.size() != 0 && tQueue.size() != 0) {
sFirst = sQueue.peek();
tFirst = tQueue.peek();
if (sFirst.equals(tFirst)) {
// 两队列首元素相同,同时出队列
sQueue.remove();
tQueue.remove();
} else {
// 两个队列的首元素不相同,只有t队列的首元素出队列
tQueue.remove();
}
}

// 上述循环结束后,如果s队列为空,表示s字符串中的各个元素都在t中匹配到了,则s字符串是t字符串的子序列
// 否则不是
return sQueue.size() == 0;
}
}


方法一的效率并不太好,探索新的方法....

再一想,两个队列确实没啥必要啊,只需要两个指针就行了...

因此有以下代码:

方法二(其实是方法一的简化实现):

public class Solution {

// 判断s是否是t的子序列
public boolean isSubsequence(String s, String t) {
// s字符串的指针,记录当前判断到了s字符串的什么位置
int sIndex = 0;
// s字符串的指针,记录当前判断到了s字符串的什么位置
int tIndex = 0;

int sLength = s.length();
int tLength = t.length();

char sFirst;
char tFirst;
while (sIndex < sLength && tIndex < tLength) {
sFirst = s.charAt(sIndex);
tFirst = t.charAt(tIndex);

// 如果s字符串的当前元素和t字符串的当前元素相同...
if (sFirst == tFirst) {
sIndex++;
tIndex++;
} else {
// 如果s字符串的当前元素和t字符串的当前元素不同...
tIndex++;
}
}
// 若上述循环结束时,s字符串的指针指向了s字符串的最后端,则s是t的子序列,否则不是.
return sIndex == sLength;
}
}

方法二比方法一在效率上稍有提高。

方法二中的代码还可以更简洁:

public class Solution {

// 判断s是否是t的子序列
public boolean isSubsequence(String s, String t) {
int sLen = s.length();
int tLen = t.length();
// 指示当前位置的指针
int sIndex = 0;
for (int i = 0; i < tLen && sIndex < sLen; i++) {
if (s.charAt(sIndex) == t.charAt(i)) {
sIndex++;
}
}
return sIndex == sLen;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: