Top Interview 150
The Is Subsequence problem is a great challenge that involves iterating through strings to determine if one is a subsequence of the other. Letβs break down LeetCode 392: Is Subsequence and explore both standard and optimized solutions.
π Problem Description
Given two strings s
and t
:
- Return
true
ifs
is a subsequence oft
. - A subsequence of a string is formed by deleting some characters (or none) from the original string without changing the relative order of the remaining characters.
π‘ Examples
Example 1
Input: s = "abc", t = "ahbgdc" Output: true Explanation: "abc" is a subsequence of "ahbgdc".
Example 2
Input: s = "axc", t = "ahbgdc" Output: false Explanation: "axc" is not a subsequence of "ahbgdc".
π JavaScript Solution
Approach 1: Two Pointer Technique
Use two pointers to traverse both strings, checking if the characters of s
appear in the same order in t
.
Implementation
var isSubsequence = function(s, t) { let i = 0; let j = 0; while (i < s.length && j < t.length) { if (s[i] === t[j]) { i++; } j++; } return i === s.length; };
π How It Works
-
Pointers:
- Use
i
to traverses
andj
to traverset
.
- Use
-
Character Matching:
- If
s[i] === t[j]
, move both pointers. - Otherwise, only move
j
to check the next character int
.
- If
-
Check Completion:
- If
i
reaches the end ofs
, then all characters ins
are matched in order int
.
- If
π Complexity Analysis
- Time Complexity: O(n+m), where
n=s.length
andm=t.length
.- Traverse
t
at most once ands
at most once.
- Traverse
- Space Complexity: O(1), as no additional data structures are used.
π Dry Run
Input: s = "abc"
, t = "ahbgdc"
Follow-Up: Efficient Handling for Multiple s
Strings
If there are many incoming s
strings to check against a fixed t
, preprocess t
into an index map for efficient lookup.
Approach 2: Preprocessing t for Faster Matching
Preprocessing: Build a map of character positions for t
.
- This allows for binary search to quickly locate the next valid position for each character in
s
.
Optimized Implementation
var isSubsequence = function(s, t) { // Preprocess t into a map of character indices const indexMap = new Map(); for (let i = 0; i < t.length; i++) { if (!indexMap.has(t[i])) { indexMap.set(t[i], []); } indexMap.get(t[i]).push(i); } let prevIndex = -1; // Previous matching index in t for (let char of s) { if (!indexMap.has(char)) return false; // Character not in t const positions = indexMap.get(char); const nextIndex = binarySearch(positions, prevIndex); if (nextIndex === -1) return false; // No valid position found prevIndex = nextIndex; // Update to the latest matching index } return true; }; // Helper function: Binary search for the next valid index function binarySearch(arr, target) { let left = 0; let right = arr.length - 1; while (left <= right) { const mid = Math.floor((left + right) / 2); if (arr[mid] > target) { right = mid - 1; } else { left = mid + 1; } } return left < arr.length ? arr[left] : -1; }
π Complexity Analysis
-
Preprocessing:
- Time Complexity: O(m), where
m=t.length
, to build the index map. - Space Complexity: O(m), for storing character indices.
- Time Complexity: O(m), where
-
Query:
- Time Complexity:
O(nβ logm)
, wheren=s.length
andm=t.length
. Each character in s requires a binary search int
.
- Time Complexity:
π Dry Run
Input: s = "abc"
, t = "ahbgdc"
Index Map:
{ a: [0], h: [1], b: [2], g: [3], d: [4], c: [5] }
Steps:
Find a
β Next valid index is 0
.
Find b
β Next valid index is 2
.
Find c
β Next valid index is 5
.
Output: true
β¨ Pro Tips for Interviews
-
Understand Use Cases:
- Two-pointer is ideal for single queries.
- Preprocessing is better for multiple queries.
-
Discuss Edge Cases:
- Empty
s
(""
) β Alwaystrue
. - Characters in
s
not int
("xyz", "abc"
) β Alwaysfalse
.
- Empty
-
Explain Preprocessing:
- Highlight how the index map reduces redundant computations.
π Learn More
Check out the detailed explanation and code walkthrough on my Dev.to post:
π Valid Palindrome - JavaScript Solution
Which approach would you choose for your scenario? Letβs discuss! π
Top comments (1)
Follow Me on GitHub π
If you found this solution helpful, check out more of my projects and solutions on my GitHub profile.
Don't forget to follow for more updates!