1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
- KMP算法的应用
- strstr的优化
-
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const
int
maxm = 1E4 + 10;
int
next[maxm];
void
makenext(
char
P[]){
int
m =
strlen
(P);
memset
(next, 0 ,
sizeof
(
int
)*m);
for
(
int
i = 1,j = 0;i < m;){
if
(P[i] == P[j]) next[i++] = ++j;
else
if
( j > 0) j = next[j - 1];
else
i++;
}
}
int
kmp(
char
T[],
char
P[]){
int
n =
strlen
(T);
int
m =
strlen
(P);
makenext(P);
for
(
int
i = 0,j = 0;i < n;){
if
(T[i] == P[j]) i++,++j;
else
if
( j > 0 ) j = next[j - 1];
else
i++;
if
(j == m)
return
i - m;
}
return
-1;
}
int
mystrstr(
char
str[],
char
strsearch[]){
//在str中查找strsearch,
// 如果找到,返回第一次出现的下标,
// 否则返回-1
return
kmp(str,strsearch);
}
- 循环节相关
- 最后一位 未匹配部分长度如果能整除匹配部分长度,
- 那么未匹配部分就是循环节(注意是否需要特殊处理,整个字符串是一个循环节的情况)
-
1
2
3
4
5
6
int
len =
strlen
(str);
makenext(str);
int
tmp = len - next[len - 1];
int
res;
if
(len % tmp || tmp == len) res = tmp - len % tmp;
//不是循环节,补成循环节需要的最少字符
else
res = 0;
//是循环节
- 回文字符串相关
- 最后一个字符,未匹配部分补上去,整个字符串就是回文
- strstr的优化
-
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const
int
maxm = 1E4 + 10;
int
next[maxm];
void
makenext(
char
P[]){
int
m =
strlen
(P);
memset
(next, 0 ,
sizeof
(
int
)*m);
for
(
int
i = 1,j = 0;i < m;){
if
(P[i] == P[j]) next[i++] = ++j;
else
if
( j > 0) j = next[j - 1];
else
i++;
}
}
int
kmp(
char
T[],
char
P[]){
int
n =
strlen
(T);
int
m =
strlen
(P);
makenext(P);
for
(
int
i = 0,j = 0;i < n;){
if
(T[i] == P[j]) i++,++j;
else
if
( j > 0 ) j = next[j - 1];
else
i++;
if
(j == m)
return
i - m;
}
return
-1;
}
int
mystrstr(
char
str[],
char
strsearch[]){
//在str中查找strsearch,
// 如果找到,返回第一次出现的下标,
// 否则返回-1
return
kmp(str,strsearch);
}
- 循环节相关
- 最后一位 未匹配部分长度如果能整除匹配部分长度,
- 那么未匹配部分就是循环节(注意是否需要特殊处理,整个字符串是一个循环节的情况)
-
12
3
4
5
6
int
len =
strlen
(str);
makenext(str);
int
tmp = len - next[len - 1];
int
res;
if
(len % tmp || tmp == len) res = tmp - len % tmp;
//不是循环节,补成循环节需要的最少字符
else
res = 0;
//是循环节
- 回文字符串相关
- 最后一个字符,未匹配部分补上去,整个字符串就是回文