实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
这道题思路不难,我用了两种做法:
1,利用String里面的substring()函数来依次截取,然后判断字符串是否相等。由于思路简单,这里不做赘述,看代码:
class Solution {
public int strStr(String haystack, String needle) {
int len1 = haystack.length() , len2 = needle.length() ;
if(len1 < len2 )
return -1 ;
for( i = 0 ; i < len1 ; i= i + 1){
if( i + len2 <= len1){
//截取字符串然后比较
String newS = haystack.substring( i , len2+i) ;
System.out.println(newS) ;
if(needle.equals(newS)) //调用equals()函数
return i ;
}
}
return -1 ;
}
}
执行效果如下:
看到此处的时间效率太高,我也不想总自带的函数来实现。看是否能手动写出来一个实现该问题的方法,于是我尝试着写了一个,发现在测试用例较少的情况下比第一个方法要好。
2,采用双层for循环,来暴力判断字符串是否相等:
class Solution {
public int strStr(String haystack, String needle) {
int i , j = 0 ,k = 0 ;
int len1 = haystack.length() , len2 = needle.length() ;
boolean flag = true ;
if(len1 < len2 )
return -1 ;
for( i = 0 ; i < len1 ; i= i + 1){
if(needle.charAt(0) == haystack.charAt(i)){
//如果needle的第一个字符与haystack的某个字符相等,就比较后面的
for( j = 1 ; j < len2 && i + j < len1 ; j++){
//依次比较后面的看是不是仍然相等
if(needle.charAt(j) != haystack.charAt(i + j)){
flag = false ;
break ;
}
}
}
flag = true ;
//若通过比较发现needle与haystack全相等,则返回i
if(flag == true && j == len2){
return i ;
}
}
return -1 ;
}
}
运行结果如下:
结论: 在数据集较少的情况下第二种方法有较好的结果。但是如果数据集非常大的话就很难说了,估计是第一种情况会好! 另外,第二种方法还有优化空间,我这里就没有继续优化,读者和网友可以试着简化。