[TOC]
### 定义
### C语言中的串实现方式
```
#include <string.h>
#include <malloc.h>
int main(void) {
//char *a = "dadsasdewe";
//char arr[11] = {"dadsasdewe"};
char *p = (char *)malloc(sizeof(char)*10);
strncpy(p,"qwe1212",8);
*(p+1) = '0';
//*(a+1)= 'q';
/*
int i;
for(i=0;i<strlen(a);i++) {
(*a) +1 = 'q';
}
*/
printf("s is %s",p);
}
```
### KMP算法
#### 基本原理
![](https://box.kancloud.cn/157f7d193a8ec699d7eecfc35efb3ef3_644x1786.jpg)
##### next数组原理
![](https://box.kancloud.cn/afd7e9c1fae793a72a32f99b198d6f80_645x189.png)
* "A"的前缀和后缀都为空集,共有元素的长度为0;
* "AB"的前缀为[A],后缀为[B],共有元素的长度为0;
* "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度0;
* "ABCD"的前缀为[A, AB, ABC],后缀为[BCD, CD, D],共有元素的长度为0;
* "ABCDA"的前缀为[A, AB, ABC, ABCD],后缀为[BCDA, CDA, DA, A],共有元素为"A",长度为1;
* "ABCDAB"的前缀为[A, AB, ABC, ABCD, ABCDA],后缀为[BCDAB, CDAB, DAB, AB, B],共有元素为"AB",长度为2;
* "ABCDABD"的前缀为[A, AB, ABC, ABCD, ABCDA, ABCDAB],后缀为[BCDABD, CDABD, DABD, ABD, BD, D],共有元素的长度为0。
#### 实现代码