Difficulty:easy
More:【目录】LeetCode Java实现
Description
https://leetcode.com/problems/implement-strstr/
Implement strStr().
Return the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
Example 1:
Input: haystack = "hello", needle = "ll" Output: 2
Example 2:
Input: haystack = "aaaaa", needle = "bba" Output: -1
Clarification:
What should we return when needle is an empty string? This is a great question to ask during an interview.
For the purpose of this problem, we will return 0 when needle is an empty string. This is consistent to C's strstr() and Java's indexOf().
Intuition
1.Brute-force solution: Use two pointers
2. KMP algorithm
Solution
Brute force solution:
public int strStr(String haystack, String needle) {
if(haystack==null || needle==null)
return -1;
for(int i=0;;i++){
for(int j=0;;j++){
if(j==needle.length()) return i;
if(i+j==haystack.length()) return -1;
if(haystack.charAt(i+j)!=needle.charAt(j)) break;
}
}
}
public int strStr(String haystack, String needle) {
if(needle.isEmpty())
return 0;
int i=0,j=0;
while(i<haystack.length()){
if(haystack.charAt(i)==needle.charAt(j)){
i++;
j++;
if(j==needle.length())
return i-j;
if(i==haystack.length())
return -1;
}else{
i=i-j+1;
j=0;
}
}
return -1;
}
public int strStr(String haystack, String needle) {
if(needle.length()==0)
return 0;
for(int i=0; i<haystack.length()-needle.length()+1; i++){
if(haystack.charAt(i)==needle.charAt(0)){
int j=0;
for(; j<needle.length(); j++){
if(haystack.charAt(i+j)!=needle.charAt(j))
break;
}
if(j==needle.length())
return i;
}
}
return -1;
}
KMP:
public int strStr(String haystack, String needle) {
if(needle.isEmpty())
return 0;
int[] next = getNext(needle);
int i=0, j=0;
while(i<haystack.length()){
if(j==-1 || haystack.charAt(i)==needle.charAt(j)){
i++;
j++;
if(j==needle.length())
return i-j;
}else{
j=next[j];
}
}
return -1;
}
//next[i]数组:
// 1. i=0时,next[i]=-1;
// 2. 前后缀相等长度为n时, next[i]=n;(可改进)
// 3. 其余:next[i]=0;
private static int[] getNext(String str) {
if (str == null || str.isEmpty())
return null;
int[] next = new int[str.length()];
next[0] = -1;
int i = 0, j = -1; //i为后缀的位置,j为前缀位置
while (i < str.length() - 1) { //此处范围注意
if (j == -1 || str.charAt(i) == str.charAt(j)) {
i++;
j++;
//next[i] = j;
next[i] = str.charAt(i) == str.charAt(j) ? next[j] : j; //前后缀相等长度为j
} else {
j = next[j];
}
}
return next;
}
Complexity
Brute Force:
Time complexity :
Assume that n = length of haystack and m = length of needle, then the runtime complexity is O(nm).
Space complexity : O(1)
KMP:
Time complexity : O(n)
Space complexity: O(m)
What I've learned
1. It is a great question to ask "What should we return when needle is an empty string?" during an interview.
More:【目录】LeetCode Java实现