392. Is Subsequence

Question

LeetCode Problem

Given two strings s and t, return true if s is a subsequence of t, or false otherwise.

A subsequence of a string is a new string that is formed from the original string by deleting some (can be none) of the characters without disturbing the relative positions of the remaining characters. (i.e., "ace" is a subsequence of "abcde" while "aec" is not).

Example 1:

Input: s = "abc", t = "ahbgdc"
Output: true

Example 2:

Input: s = "axc", t = "ahbgdc"
Output: false

Constraints:

Follow up: Suppose there are lots of incoming s, say s1, s2, ..., sk where k >= 10^9, and you want to check one by one to see if t has its subsequence. In this scenario, how would you change your code?


Solutions

Use DP

bool isSubsequence(string s, string t) {
	size_t m = s.size();
	size_t n = t.size();
	vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
	for (int i = 1; i <= m; ++i) {
		for (int j = 1; j <= n; ++j) {
			if (s[i-1] == t[j-1]) {
				dp[i][j] = dp[i-1][j-1] + 1;
			} else {
				dp[i][j] = dp[i][j-1];
			}
		}
	}
	if (dp[m][n] == m) return true;
	else return false;
}

Use two pointer (better approach 👍🏻)

bool isSubsequence(string s, string t) {
	size_t m = s.size();
	size_t n = t.size();
	int i = 0;
	int j = 0;
	while (i < m && j < n) {
		if (s[i] == t[j]) {
			++i;
		}
		++j;
	}
	return i == n;
}