Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
题目意思很简单:两个字符串haystack和needle,返回字符串needle在haystack中第一次出现的位置,不存在返回-1。
我采用比较简单直观的方法,先在haystack中找到一个与needle第一个字符相等的字符。然后开始比较此字符其后的字符是否与needle对应相等,是即返回第一个字符位置,否则继续上述流程,寻找第一个满足的字符。注意几个边界条件:字符串为空,haystack长度大于needle。代码如下:
public int strStr(String haystack, String needle) {
int haystackLength = haystack.length();
int needleLength = needle.length();
if(haystack == null || needle == null) {
return -1;
}
if(haystackLength < needleLength) {
return -1;
}
if(haystackLength == needleLength) {
if(haystack.equals(needle)) {
return 0;
} else {
return -1;
}
}
if(needleLength == 0) {
return 0;
}
int haystackIndex = 0;
int needleIndex = 0;
int temp = 0;
while(haystackIndex < haystackLength) {
if(haystack.charAt(haystackIndex) == needle.charAt(0)) {//寻找第一位相等的
temp = haystackIndex;//记录每次找到的第一个相等的字符位置
while(needleIndex < needleLength && haystackIndex < haystackLength && //&&左右两边不要颠倒,否则可能出现数组下标越界,,因为到最后haystackIndex还会++
haystack.charAt(haystackIndex) == needle.charAt(needleIndex)) {
haystackIndex++;
needleIndex++;
}
if(needleIndex == needleLength) {
return (haystackIndex - needleIndex);//比较完毕,和needle的最后一位都相同
} else {
needleIndex = 0;//中间有不相同的,不满足条件,置零,重新比较
haystackIndex = temp+1;//从下一位开始继续找
}
} else {
haystackIndex++;//第一位不相等,右移继续找
}
}
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;
}
}
}