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
- LeetCode 392. Is Subsequence 题解——Java
- LeetCode 392. Is Subsequence 题解
- leetcode题解-392. Is Subsequence
- LeetCode—392. Is Subsequence
- LeetCode 392. Is Subsequence 题解(C++)
- leetcode——Is Subsequence
- 392.[LeetCode] Is Subsequence
- LeetCode 392. Is Subsequence
- [LeetCode] 392. Is Subsequence
- 【leetcode】392. Is Subsequence
- 【LeetCode】392. Is Subsequence
- 【LeetCode】392. Is Subsequence
- Leetcode 392. Is Subsequence
- leetcode 392. Is Subsequence
- LeetCode 392. Is Subsequence
- 【LeetCode】 392. Is Subsequence
- LeetCode 392. Is Subsequence
- LeetCode 392. Is Subsequence
- 是的,阿里最近开源了两个不错的东西,对于我们来说还真不错
- 模板
- MySQL查看SQL语句执行效率
- java虚拟机知识点简要梳理
- 解决Yii单元测试没找到PHPUnit_Extensions_Database_TestCase的问题
- LeetCode 392. Is Subsequence 题解——Java
- Django runserver错误
- git获取远程主机分支
- [Leetcode]_1 Two Sum
- 第七章 函数——C++得编程模块
- mapper代理方法开发mybatis
- docker源码学习-docker run 的具体实现(2 )
- HDU 1301 Jungle Roads
- ZOJ 1610 Count the Colors(线段树 区间覆盖)