LeetCode 392. Is Subsequence 题解——Java

来源:互联网 发布:电信3g网络有哪些频段 编辑:程序博客网 时间:2024/06/01 12:30

题目链接: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;}}


0 0
原创粉丝点击