#792
Medium Algorithms Number of matching subsequences
Array Hash Table String Binary Search Dynamic Programming Trie Sorting
50.6% acceptance
Feb 21, 2026
5795
246
Given a string s and an array of strings words, return the number of words[i] that is a subsequence of s.
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.
For example, "ace" is a subsequence of "abcde".
Solution
Rust
Time O(n * m)
Space O(n * m)
/*
* Given a string s and an array of strings words, return the number of words[i] that is a subsequence of s.
* 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.
* For example, "ace" is a subsequence of "abcde".
* Example 1:
* Input: s = "abcde", words = ["a","bb","acd","ace"]
* Output: 3
* Explanation: There are three strings in words that are a subsequence of s: "a", "acd", "ace".
* Example 2:
* Input: s = "dsahjpjauf", words = ["ahjpjau","ja","ahbwzgqnuk","tnmlanowax"]
* Output: 2
* Constraints:
* 1 <= s.length <= 5 * 104
* 1 <= words.length <= 5000
* 1 <= words[i].length <= 50
* s and words[i] consist of only lowercase English letters.
*/
impl Solution {
pub fn num_matching_subseq(s: String, words: Vec<String>) -> i32 {
let mut pos: Vec<Vec<usize>> = vec![vec![]; 26];
for (i, c) in s.bytes().enumerate() {
pos[(c - b'a') as usize].push(i);
}
let is_subseq = |word: &str| -> bool {
let mut cur = 0usize;
for c in word.bytes() {
let p = &pos[(c - b'a') as usize];
match p.partition_point(|&x| x < cur) {
idx if idx < p.len() => cur = p[idx] + 1,
_ => return false,
}
}
true
};
words.iter().filter(|w| is_subseq(w)).count() as i32
}
}