Given string S
and a dictionary of words words
, find the number of words[i]
that is a subsequence of S
.
Example : Input: S = "abcde" words = ["a", "bb", "acd", "ace"] Output: 3 Explanation: There are three words in words that are a subsequence of S: "a", "acd", "ace".
Note:
- All words in
words
andS
will only consists of lowercase letters. - The length of
S
will be in the range of[1, 50000]
. - The length of
words
will be in the range of[1, 5000]
. - The length of
words[i]
will be in the range of[1, 50]
.
找出words列表中,是S子串的个数。
方法一:会TLE, 如下所示:
class Solution {
public int numMatchingSubseq(String S, String[] words) {
int cnt = 0;
for (String s : words){
if (isSubstring(S, s)){
cnt ++;
}
}
return cnt;
}
public boolean isSubstring(String S, String item){
int len = S.length(), size = item.length();
int index = 0;
for (int i = 0; i < len; ++ i){
if (item.charAt(index) == S.charAt(i)){
index ++;
}
if (index == size){
return true;
}
}
return false;
}
}
方法二:将words列表里面,已经处理过的进行记录,包括匹配通过的和匹配不通过的,程序如下:
class Solution {
public int numMatchingSubseq(String S, String[] words) {
int cnt = 0;
int len = S.length();
Set<String> match = new HashSet<>();
Set<String> notMatch = new HashSet<>();
for (String s : words){
if (match.contains(s)){
cnt ++;
continue;
}
if (notMatch.contains(s)){
continue;
}
if (isSubstring(S, s)){
cnt ++;
match.add(s);
}
else {
notMatch.add(s);
}
}
return cnt;
}
public boolean isSubstring(String S, String item){
int len = S.length(), size = item.length();
if (len < size){
return false;
}
int index = 0;
for (int i = 0; i < len; ++ i){
if (item.charAt(index) == S.charAt(i)){
index ++;
}
if (index == size){
return true;
}
}
return false;
}
}