π Problem Statement
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 generated from the original string with some characters (can be none) deleted without changing the relative order of the remaining characters. (i.e., "ace"
is a subsequence of "abcde"
while "aec"
is not).
π Example:
python
Input:
s = "abc", t = "ahbgdc"
Output:
true
python
Input:
s = "axc", t = "ahbgdc"
Output:
false
π§ Key Insight
To determine whether s
is a subsequence of t
, we need to check if we can find all the characters of s
in t
while maintaining their relative order. A simple approach to solve this problem is by using the two-pointer technique.
π‘ Approach
- Two Pointers Technique:
- Use two pointers, one for string
s
and another for string t
. Traverse both strings, trying to match each character of s
with the characters of t
.
- Traverse Through Both Strings:
- Move the pointer on
t
to check every character.
- If the character in
t
matches the character in s
, move the pointer for s
to the next character.
- Continue this process until you either match all characters of
s
or finish the string t
.
- Return Result:
- If you successfully match all characters of
s
, return True
.
- If you finish traversing
t
without matching all characters of s
, return False
.
π Python Code
python
class Solution:
def isSubsequence(self, s: str, t: str) -> bool:
# Initialize pointers for both strings
i, j = 0, 0
# Traverse the string t with pointer j
while i < len(s) and j < len(t):
if s[i] == t[j]: # If characters match, move pointer i
i += 1
j += 1 # Always move pointer j
# If pointer i has traversed all of s, return True
return i == len(s)
π Step-by-Step Explanation
1. Initialize Pointers:
python
i, j = 0, 0
- Pointer
i
represents the current character in s
.
- Pointer
j
represents the current character in t
.
2. Traverse Both Strings:
python
while i < len(s) and j < len(t):
- The loop continues as long as both pointers are within bounds.
- The goal is to match each character of
s
with a character in t
while keeping track of their relative order.
3. Check for Matching Characters:
python
if s[i] == t[j]:
i += 1
- If the characters at
s[i]
and t[j]
match, increment the pointer i
to move to the next character in s
.
- The pointer
j
always moves forward regardless of whether there's a match.
4. Move Pointer j
:
python
j += 1
- The pointer
j
always moves forward to check the next character in t
.
5. Check If All Characters of s
Are Matched:
python
return i == len(s)
- If
i
reaches the length of s
, it means all characters in s
have been matched in t
, and we return True
.
- If
i
doesnβt reach the end of s
after the loop, return False
, indicating that not all characters of s
were found in t
in the correct order.
π‘ Example Walkthrough
Example 1:
python
Input:
s = "abc", t = "ahbgdc"
Output:
true
- First Character (
s[0] = 'a'
):
t[0] = 'a'
matches s[0]
, so move pointer i
to 1.
- Second Character (
s[1] = 'b'
):
- Continue traversing
t
until t[2] = 'b'
matches s[1]
, so move pointer i
to 2.
- Third Character (
s[2] = 'c'
):
- Continue traversing
t
until t[4] = 'c'
matches s[2]
, so move pointer i
to 3.
- Exit: Since
i
equals the length of s
, return True
.
Example 2:
python
Input:
s = "axc", t = "ahbgdc"
Output:
false
- First Character (
s[0] = 'a'
):
t[0] = 'a'
matches s[0]
, so move pointer i
to 1.
- Second Character (
s[1] = 'x'
):
- Continue traversing
t
until we find t[3] = 'g'
and t[4] = 'd'
, but there is no match for s[1] = 'x'
.
- Exit: Since
i
did not reach the length of s
, return False
.
β±οΈ Time & Space Complexity
MetricComplexityTime ComplexityO(n)Space ComplexityO(1)
- Time Complexity:
- We traverse each string at most once, so the time complexity is O(n), where n is the length of the longer string (
t
).
- Space Complexity:
- The algorithm uses a constant amount of extra space for the two pointers, so the space complexity is O(1).
π§΅ Final Thoughts
LeetCode 392 is an excellent problem for practicing the two-pointer technique to check if one string is a subsequence of another. This approach is both time-efficient and space-efficient, making it an optimal solution for such problems. The problem emphasizes the importance of maintaining relative order while checking subsequences, and the two-pointer technique is a natural fit for this challenge.