LeetCode-in-Java

792. Number of Matching Subsequences

Medium

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.

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:

Solution

import java.util.ArrayList;
import java.util.List;

@SuppressWarnings("unchecked")
public class Solution {
    public int numMatchingSubseq(String s, String[] words) {
        List<Node>[] buckets = new ArrayList[26];
        for (int i = 0; i < buckets.length; i++) {
            buckets[i] = new ArrayList<>();
        }
        for (String word : words) {
            char start = word.charAt(0);
            buckets[start - 'a'].add(new Node(word, 0));
        }
        int result = 0;
        for (char c : s.toCharArray()) {
            List<Node> currBucket = buckets[c - 'a'];
            buckets[c - 'a'] = new ArrayList<>();
            for (Node node : currBucket) {
                node.index++;
                if (node.index == node.word.length()) {
                    result++;
                } else {
                    char start = node.word.charAt(node.index);
                    buckets[start - 'a'].add(node);
                }
            }
        }
        return result;
    }

    private static class Node {
        String word;
        int index;

        public Node(String word, int index) {
            this.word = word;
            this.index = index;
        }
    }
}