串的模式匹配问题
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2
示例 2:
输入: haystack = “aaaaa”, needle = “bba”
输出: -1
法一:双指针法
i,j分别指向主串S和模式串T,当S[i]==T[j]时,i++,j++,否则指针i回溯到i-j+1,j指针回溯到0。
int strStr(char* haystack, char* needle) {
int i=0,j=0;
while(haystack[i]!='\0'&&needle[j]!='\0'){
if(haystack[i]==needle[j]){
i++;
j++;
}else{
i=i-j+1;
j=0;
}
}
if(needle[j]==NULL){
return i-j;
}else{
return -1;
}
}
法二:KMP算法
注意这里的细节:
由于i,j<0,而strlen返回值为unsigned型,因此必须强制转换,否则比较出错。
void getNext(int next[], char*T) {
next[0] = -1;
int i = 0, j = -1;
while (i<strlen(T)-1) {
if (j == -1 || T[i] == T[j]) {
i++;
j++;
next[i] = j;
}
else {
j = next[j];
}
}
}
int strStr(char* haystack, char* needle) {
if(*needle=='\0')
return 0;
if(*needle!='\0'&&*haystack=='\0')
return -1;
int i = -1, j = -1;
int *next = (int*)malloc(sizeof(int)*(strlen(needle)));
getNext(next, needle);
while (i<(int)strlen(haystack)&&j<(int)strlen(needle)) {
if (j == -1 || haystack[i] == needle[j]) {
i++;
j++;
}
else {
j = next[j];
}
}
if (needle[j] == NULL) {
return i - j;
}
else {
return -1;
}
}