描述
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
当 needle 是空字符串时我们应当返回 0
例子
思路
m=s.length() n=pat.length()
- 暴力 O(m*n) O(1)
- kmp O(m+n) O(n)
答案
- java
//暴力
public int strStr(String s, String pat) {
for(int i=0; i+pat.length()-1<s.length(); i++) {
if(s.substring(i,i+pat.length()).equals(pat)) return i;
}
return -1;
}
//kmp
class Solution {
public int strStr(String s, String pat) {
if(pat.length()==0) return 0;
//make 前缀表
int[] table=new int[pat.length()];
int i=1,len=0;
while(i<pat.length()) {
if(pat.charAt(i)==pat.charAt(len)) {
len++;
table[i]=len;
i++;
}else{
if(len>0) {
len=table[len-1];
}else{
// table[i]=0;
i++;
}
}
}
//match
int j=0;
i=0;
while(i<s.length()) {
if(j==pat.length()-1 && s.charAt(i)==pat.charAt(j))
return i+1-pat.length();
if(s.charAt(i)==pat.charAt(j)) {
i++;
j++;
}else{
if(j>0) {
j=table[j-1];
}else{
i++;
}
}
}
return -1;
}
- python
class Solution:
def strStr(self, haystack: str, needle: str) -> int:
len1=len(haystack)
len2=len(needle)
# i+len2-1=len1-1---i==len1-len2--i<len1-len2+1
for i in range(len1-len2+1):
if haystack[i:i+len2]==needle:
return i
return -1
- c++
class Solution {
public:
int strStr(string haystack, string needle) {
int len1=haystack.size(),len2=needle.size();
// i+len2-1=len1-1---i==len1-len2--i<len1-len2+1
for (int i=0; i<len1-len2+1; i++)
if (haystack.substr(i,len2)==needle)
return i;
return -1;
}
};