今天做的是LeetCode27。题目要求是找到字符串中子字符串第一次出现的序号,当未找到时返回-1
基本思路就是一个个字符进行比对
一开始想的是从第一个字符开始一直向后
代码如下:
public int strStr(String haystack, String needle) {
if((haystack.length()==0)&&(needle.length()==0))
return 0;
if(haystack.length()<needle.length())
return -1;
int i=0,j=0;
for(;i+j<haystack.length();i++){
j=0;
while (i+j<haystack.length()&&j<needle.length()){
if(haystack.charAt(i+j)!=needle.charAt(j))
break;
else
j++;
}
if(j==needle.length())
return i;
}
return -1;
}
不难理解,就是需要注意边界情况
在完成基本方法之后,突然想到,如果之前的字符都是相同的,但只有最后一个字符是不相同的,那岂不是会浪费很多的时间。突然想到,可不可以想比较最后一个字符,之后再向前比较。亲测,也的确比之前快很多。
代码如下:
public int strStr(String haystack, String needle) {
if((haystack.length()==0)&&(needle.length()==0))
return 0;
if(haystack.length()<needle.length())
return -1;
//如果要是从后向前找会不会快一点
int i=0,j=needle.length();
for(;i+j<haystack.length();i++){
j=0;
while (i+j<haystack.length()&&j>-1){
if(haystack.charAt(i+j)!=needle.charAt(j))
break;
else
j--;
}
if(j==-1)
return i;
}
return -1;
}
public int strStr(String haystack, String needle) {
for (int i = 0; ; i++) {
for (int j = 0; ; j++) {
if (j == needle.length()) return i;
if (i + j == haystack.length()) return -1;
if (needle.charAt(j) != haystack.charAt(i + j)) break;
}
}
}
以下是我目前为止最喜欢的一种解法:
public class Solution {
public int strStr(String haystack, String needle) {
int l1 = haystack.length(), l2 = needle.length();
if (l1 < l2) {
return -1;
} else if (l2 == 0) {
return 0;
}
int threshold = l1 - l2;
for (int i = 0; i <= threshold; ++i) {
if (haystack.substring(i,i+l2).equals(needle)) {
return i;
}
}
return -1;
}
}
最好的一点是令threshold为两个字符串的长度差,不再同之前一样一个个字符的比较,而是一个个字字符串的比较了。