leetcode 28:实现strStr()
实现 strStr() 函数。
给你两个字符串 haystack
和 needle
,请你在 haystack
字符串中找出 needle
字符串出现的第一个位置(下标从 0 开始)。如果不存在,则返回 -1
。
说明:
当 needle
是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle
是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。
示例 1:
输入:haystack = "hello", needle = "ll"
输出:2
示例 2:
输入:haystack = "aaaaa", needle = "bba"
输出:-1
示例 3:
输入:haystack = "", needle = ""
输出:0
提示:
0 <= haystack.length, needle.length <= 5 * 104
haystack
和needle
仅由小写英文字符组成
Related Topics
双指针
字符串
字符串匹配
官方解答:https://leetcode-cn.com/problems/implement-strstr/solution/shi-xian-strstr-by-leetcode-solution-ds6y/
暴力求解法(回溯)
从每一个位置起判断,是否构成子串。
class Solution {
public int strStr(String haystack, String needle) {
if(needle.equals("")){
return 0;
}
int len1 = haystack.length();
int len2 = needle.length();
for(int i = 0; i < len1-len2+1;i++){
int temp = i;
int j = 0;
while(j < len2 && haystack.charAt(temp)==needle.charAt(j)){
temp++;
j++;
}
if(j == len2){
return i;
}
}
return -1;
}
}
解答成功:
执行耗时:1402 ms,击败了20.48% 的Java用户
内存消耗:41.3 MB,击败了25.78% 的Java用户
思路2:KMP
class Solution {
public int strStr(String haystack, String needle) {
int m = haystack.length();
int n = needle.length();
if(n==0){
return 0;
}
//求next数组
int[] next = new int[n];
for(int i = 1,j=0 ; i < n;i++){
//找到最大的j的位置
while (j>0 && needle.charAt(i) != needle.charAt(j)){
j = next[j-1];
}
//相等加1
if(needle.charAt(i) == needle.charAt(j)){
j++;
}
next[i] = j;
}
for(int i = 0,j=0 ; i < m;i++){
//找到最大的j
while (j>0&&haystack.charAt(i)!=needle.charAt(j)){
j = next[j-1];
}
if(haystack.charAt(i) == needle.charAt(j)){
j++;
}
if(j == n){
return i-n+1;
}
}
return -1;
}
}
解答成功:
执行耗时:7 ms,击败了81.09% 的Java用户
内存消耗:40.9 MB,击败了52.84% 的Java用户