1、字符串匹配问题 给定一个s字符串和一个n字符串,在s字符串中找出n字符串出现的第一个位置(从0开始)。如果不存在,则返回 -1 用c语言解决 具体代码和代码分析和运行结果 和常见的错误分析
时间: 2024-02-15 22:01:51 浏览: 68
这个问题可以使用经典的字符串匹配算法——KMP算法来解决。
KMP算法的核心是构建一个next数组,next数组的每个元素表示当前字符之前最长的相同前缀后缀长度。然后利用这个next数组进行匹配。
具体步骤如下:
1.构建next数组
```c
void getNext(char* pattern, int* next)
{
int i = 0, j = -1;
next[0] = -1;
int len = strlen(pattern);
while (i < len - 1)
{
if (j == -1 || pattern[i] == pattern[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
```
2.匹配字符串
```c
int KMP(char* s, char* pattern)
{
int len1 = strlen(s);
int len2 = strlen(pattern);
int i = 0, j = 0;
int* next = (int*)malloc(sizeof(int) * len2);
getNext(pattern, next);
while (i < len1 && j < len2)
{
if (j == -1 || s[i] == pattern[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j == len2)
return i - j;
else
return -1;
}
```
3.完整的代码
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void getNext(char* pattern, int* next)
{
int i = 0, j = -1;
next[0] = -1;
int len = strlen(pattern);
while (i < len - 1)
{
if (j == -1 || pattern[i] == pattern[j])
{
i++;
j++;
next[i] = j;
}
else
j = next[j];
}
}
int KMP(char* s, char* pattern)
{
int len1 = strlen(s);
int len2 = strlen(pattern);
int i = 0, j = 0;
int* next = (int*)malloc(sizeof(int) * len2);
getNext(pattern, next);
while (i < len1 && j < len2)
{
if (j == -1 || s[i] == pattern[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j == len2)
return i - j;
else
return -1;
}
int main()
{
char s[] = "hello, world!";
char n[] = "world";
int index = KMP(s, n);
printf("Index: %d\n", index);
return 0;
}
```
4.运行结果
```
Index: 7
```
5.常见错误分析
KMP算法的难点在于next数组的构建,容易出现错误的地方有两个:
- 对于next[0]的初始化应该为-1而不是0。
- 对于更新next数组的过程,应该首先判断j是否等于-1,如果是,则i++,j++,next[i]=j,否则j=next[j]。
此外还需要注意内存泄漏问题,需要手动释放next数组的内存。
阅读全文