一、题目1
二、思路
非常简单粗暴,循环遍历整个S和words[i]中的每一个字符,然后进行判断就行了。但是因为题目输入中存在相当多的相同字符串和非常长的字符串S,所以自然而然的就超时了。
下面是未优化过的代码:
public int numMatchingSubseq(String S, String[] words) {
int count = 0;
for ( String str : words ){
int i = 0, j = 0;
while ( i < S.length() && j < str.length() ){
if ( S.charAt(i) == str.charAt(j) )
j++;
i++;
}
if ( j == str.length() )
count++;
// System.out.println( str + "\t " + j +"\t"+count );
}
return count;
}
然后想了半天,做了两个字典进行优化,对每一个words中的字符串在判断之后根据判断的结果将其存储在不同的两个字典中,用于之后的判断,在通过字典中以及存在的字符就无需进行下一步的判断了,直接就知道他是通过的,在不通过字典中存在的直接知道他是不存在的。
三、代码
import java.util.ArrayList;
import java.util.List;
public class T0792 {
public T0792(){
String[] words ={"a", "bb", "acd", "ace"};
System.out.println( numMatchingSubseq( "abcde", words) );
}
public int numMatchingSubseq(String S, String[] words) {
//以下两个list分别用来存储子串,非子串,用来进行判断
List<String> dirCon = new ArrayList<String>();
List<String> dirUncon = new ArrayList<String>();
//存储符合规则的字符串个数
int count = 0;
//遍历整个数组,得到结果
for ( String str : words ){
//首先进行判断,在之前是否已经存在相同的子串
//判断是否是之前已经存在的通过的
if ( dirCon.contains(str) ){
count++;
//判断是否是之前已经存在的,未通过的
}else if ( dirUncon.contains(str) ) {
continue;
//如果不存在相同子串在进行下一步的判断
//首先进行整体判断,字符串S中是否包含str
}else if ( S.contains(str) ){
count++;
dirCon.add(str); //将通过判断的字符串添加在已经通过的结果集中,方便之后的进行判断
//再进行单个的判断
}else {
//两个指针分别指向S和str的单个字符
int i = 0, j = 0;
//循环直到S或者str尾部
while ( i < S.length() && j < str.length() ){
//判断S是否存在当前指向的str的单个字符,不存在就直接结束循环
if ( S.contains(str.charAt(j)+"")){
//如果S当前指向字符和str当前指向字符相同就将指针后移一位
if ( S.charAt(i) == str.charAt(j) )
j++;
i++;
}else
break;
}
//判断str是否已经全部被遍历
//若是就将count加一并将其添加在dirCon中
//否就将其添加在dirUncon中
if ( j == str.length() ){
count++;
dirCon.add(str);
}else
dirUncon.add(str);
}
// System.out.println( str + "\t " + j +"\t"+count );
}
return count;
}
public static void main(String[] args) {
T0792 t0792 = new T0792();
}
}
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-matching-subsequences
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 ↩︎