Skip to main content
Back to problems
#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)
LeetCode
solution.rs
/*
 * 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
  }
}