题目要求
现有一个小写英文字母组成的字符串s和一个包含较短小写英文字符串的数组p,请设计一个高效算法,对于p中的每一个较短字符串,判断其是否为s的子串。
给定一个string数组p和它的大小n,同时给定string s,为母串,请返回一个bool数组,每个元素代表p中的对应字符串是否为s的子串。保证p中的串长度小于等于8,且p中的串的个数小于等于500,同时保证s的长度小于等于1000。
输入输出
[“a”,“b”,“c”,“d”],4,“abc”
返回:[true,true,true,false]
方法剖析
1、将子串分别与字符串S进行比较,判断字符串s是否包含字串,不使用String类中的indexof方法和contains方法
代码:
public static boolean[] chkSubStr(String[] p, int n, String s) {
boolean[] booleans = new boolean[p.length];
for(int a = 0; a < p.length;a++){
String str = p[a];
int count = 0;
for(int j = 0;j <= s.length()-str.length();j++){
if(s.charAt(j) == str.charAt(0)){
int q = j;
int k = 0;
while(k <str.length()&&q<=s.length()){
if(s.charAt(q) == str.charAt(k)){
q++;
k++;
count++;
}else{
break;
}
}
if(count == str.length()){
booleans[a] =true;
break;
}else{
booleans[a] = false;
count =0;
}
}
}
}
return booleans;
}
2、使用String类中的indexof方法:
public static boolean[] chkSubStr1(String[] p, int n, String s){
boolean[] booleans = new boolean[p.length];
for(int i = 0;i <p.length;i++){
int count = s.indexOf(p[i],0);
if(count >= 0){
booleans[i] = true;
}
}
return booleans;
}
3、使用String中的contains方法
public boolean[] chkSubStr(String[] p, int n, String s) {
boolean[] a = new boolean[n];
for (int i = 0; i < p.length; i++) {
if(s.contains(p[i])){
a[i] = true;
}else{
a[i] = false;
}
}
return a;
}
总结
上述三种方法中,第一种时间复杂度最高,但是也是对算法的一种学习。