实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = "hello", needle = "ll"
输出: 2
示例 2:
输入: haystack = "aaaaa", needle = "bba"
输出: -1
说明:
-
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
-
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
解:题目不难,设置两个指针i,j分别指向haystack和needle,当碰到相同字符,保存一个fakeI,i,j同时遍历,跳出循环时如果j== nLength那说明存在,直接返回保存的fakeI,否则i重置fakeI+1继续。就是LeetCode的有些用例太恶心,比如null和空字符串,返回0和-1的问题,我觉得既然是重点考察算法,就没必要搞这些恶心的用例,只要主要算法思想出来了就行,这些临界点的问题只是让做题者多花了时间在调试代码上,没有什么意义。
class Solution {
public int strStr(String haystack, String needle) {
if (needle == null) {
return 0;
}
int hLength = haystack.length();
int nLength = needle.length();
if (hLength == 0 && nLength == 0) {
return 0;
}
if (hLength != 0 && nLength == 0) {
return 0;
}
if (needle.equals(haystack)) {
return 0;
}
int i = 0;
int j = 0;
while (i <= (hLength - nLength)) {
int fakeI = i;
while (j < nLength && haystack.charAt(i) == needle.charAt(j)) {
i++;
j++;
}
if (j == nLength) {
return fakeI;
} else {
i = fakeI + 1;
j = 0;
}
}
return -1;
}
}