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代码如下:
方法一的效率并不太好,探索新的方法....
再一想,两个队列确实没啥必要啊,只需要两个指针就行了...
因此有以下代码:
方法二(其实是方法一的简化实现):
方法二比方法一在效率上稍有提高。
方法二中的代码还可以更简洁:
题目要求:判断字符串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; } }
相关文章推荐
- [LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql)
- Remove Nth Node From End of List---leetcode 我的java题解
- LeetCode 3. Longest Substring Without Repeating Characters 题解——Java
- LeetCode 100. Same Tree 题解 —— Java
- LeetCode 96. Unique Binary Search Trees 题解 —— Java
- LeetCode题解汇总(C++ Java Python,含题目翻译)
- LeetCode 169. Majority Element 题解 ——Java
- leetcode题解Java | 491. Increasing Subsequences
- leetcode题解Java | 148. Sort List
- leetcode题解Java | 310. Minimum Height Trees
- LeetCode 19之Remove Nth Node From End of List的Java题解(三种解法)
- LEETCODE 7 Reverse Integer (JAVA题解)
- 【leetcode题解】【有问题,python没AC,java却过了】【M】【66】Perfect Squares
- LeetCode 111. Minimum Depth of Binary Tree 题解——Java
- LEETCODE 11 Container With Most Water (JAVA题解)
- Remove Duplicates from Sorted Array---leetcode 我的java题解
- LeetCode242_Valid Anagram(判断两个字符串是不是由完全一样字符组成) Java题解
- LEETCODE 9 Palindrome Number (JAVA题解)
- LeetCode 222. Count Complete Tree Nodes 题解——Java
- LeetCode 26. Remove Duplicates from Sorted Array 题解——Java