LeetCode 392. Is Subsequence 题解——Java

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值