Problem
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 * 10^41 <= words.length <= 50001 <= words[i].length <= 50sandwords[i]consist of only lowercase English letters.
Solution (Java)
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;
}
}
}
Explain:
nope.
Complexity:
- Time complexity : O(n).
- Space complexity : O(n).