题目难度:
Easy
题目要求:
实现 strStr() 函数。
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1 。
说明:
当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
算法思路:
1、三个指针,slow指向haystack与needle匹配的第一个字符,最后返回的也是slow;fast指向haystack目前正在做比较的字符,当前字符;nee指向needle目前正在做比较的字符,当前字符;
2、考虑特殊情况,如果haystack或者needle为空,那么根据要求,返回0;
3、开始比较,初始时,三个指针都在0位置;
4、如果fast的字符与nee的字符相同,则fast++;nee++;slow不动,要记住起始位置;
5、如果fast和nee的字符不同,表示这一次比较失败,nee应该回到0的位置,等待下一次从头比较,fast应该回到目前slow的位置,然后和slow一起+1;从下一位开始比较;
6、判断比较完成,如果,fast等于haystack的长度了,表示haystack比较完了,还没完全匹配,则返回-1;如果nee等于了needle的长度,则表示,needle比较完了,前面的都匹配,则可以返回目前slow的位置;
7、除此之外的其他情况,都表示没有匹配成功,返回-1;
代码:
class Solution {
public int strStr(String haystack, String needle) {
int length1 = haystack.length();
int length2 = needle.length();
int slow = 0;
int fast = 0;
int nee = 0;
if (needle.length() == 0 || haystack.length() == 0) {
return 0;
}
while (nee < length2) {
if (fast == length1) {
return -1;
}
if (haystack.charAt(fast) == needle.charAt(nee)) {
fast++;
nee++;
} else {
fast = slow;
slow++;
fast++;
nee = 0;
}
}
if (nee == length2) {
return slow;
}
return -1;
}
}
时间复杂度:O(m*n)
空间复杂度:O(1)