- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C语言数据结构中串的模式匹配由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
C语言数据结构中串的模式匹配 。
串的模式匹配问题:朴素算法与KMP算法 。
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
|
#include<stdio.h>
#include<string.h>
int
Index(
char
*S,
char
*T,
int
pos){
//返回字串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0.
//其中,T非空,1<=pos<=StrLength(s).
int
i=pos;
int
j=1;
while
(i<=S[0]&&j<=T[0]){
if
(S[i]==T[j]){++i;++j;}
else
{i=i-j+2;j=1;}
}
if
(j>T[0])
return
i-T[0];
else
return
0;
}
int
get_next(
char
*T,
int
next[]){
//求模式串T的next函数值并存入数组next。
int
i=1;next[1]=0;
int
j=0;
while
(i<T[0]){
if
(j==0||T[i]==T[j]){++i;++j;next[i]=j;}
else
j=next[j];
}
return
*next;
}
int
Index_KMP(
char
*S,
char
*T,
int
pos){
//利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法,其中T非空,1<=pos<=StrLength(S).
int
next[100];
*next=get_next(T,next);
int
j=1,i=pos;
while
(i<=S[0]&&j<=T[0]){
if
(j==0||S[i]==T[j]){++i;++j;}
else
j=next[j];
}
if
(j>T[0])
return
i-T[0];
else
return
0;
}
void
main()
{
int
id,j,k,i,a;
printf
(
"输入主串、子串和匹配起始位置\n"
);
char
A[20];
char
B[10];
printf
(
"请输入主字串内容\n"
);
gets
(A+1);
*A=
strlen
(A+1);
printf
(
"请输入子字串内容\n"
);
gets
(B+1);
*B=
strlen
(B+1);
printf
(
"请输匹配起始位置\n"
);
scanf
(
"%d"
,&j);
//printf("%d ",k);
do
{
printf
(
"\n请输入您需要的任务的序号"
);
printf
(
"\n1:朴素的模式匹配算法"
);
printf
(
"\n2:快速模式匹配算法"
);
printf
(
"\n3:退出\n"
);
scanf
(
"%d"
,&id);
switch
(id){
case
1:
{
printf
(
"\n\n你调用了功能1:"
);
printf
(
"\n朴素的模式匹配算法"
);
k=Index(A,B,j);
printf
(
"\n该位置为:"
);
printf
(
"%d\n"
,k);
break
;}
case
2:
{
printf
(
"\n\n你调用了功能2:"
);
printf
(
"\n 快速模式匹配算法"
);
a=Index_KMP(A,B,j);
printf
(
"\n该位置为:"
);
printf
(
"%d\n"
,a);
break
;}
case
3:
{
printf
(
"\n\n你调用了功能3:"
);
printf
(
"\n退出\n"
);
}
}
}
while
(id!=3);
|
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#include<stdio.h>
#include<string.h>
int
Index(
char
*S,
char
*T,
int
pos){
//返回字串T在主串S中第pos个字符之后的位置。若不存在,则函数值为0.
//其中,T非空,1<=pos<=StrLength(s).
int
i=pos;
int
j=1;
while
(i<=S[0]&&j<=T[0]){
if
(S[i]==T[j]){++i;++j;}
else
{i=i-j+2;j=1;}
}
if
(j>T[0])
return
i-T[0];
else
return
0;
}
int
get_next(
char
*T,
int
next[]){
//求模式串T的next函数值并存入数组next。
int
i=1;next[1]=0;
int
j=0;
while
(i<T[0]){
if
(j==0||T[i]==T[j]){++i;++j;next[i]=j;}
else
j=next[j];
}
return
*next;
}
int
Index_KMP(
char
*S,
char
*T,
int
pos){
//利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法,其中T非空,1<=pos<=StrLength(S).
int
next[100];
*next=get_next(T,next);
int
j=1,i=pos;
while
(i<=S[0]&&j<=T[0]){
if
(j==0||S[i]==T[j]){++i;++j;}
else
j=next[j];
}
if
(j>T[0])
return
i-T[0];
else
return
0;
}
void
main()
{
int
id,j,k,i,a;
printf
(
"输入主串、子串和匹配起始位置\n"
);
char
A[20];
char
B[10];
printf
(
"请输入主字串内容\n"
);
gets
(A+1);
*A=
strlen
(A+1);
printf
(
"请输入子字串内容\n"
);
gets
(B+1);
*B=
strlen
(B+1);
printf
(
"请输匹配起始位置\n"
);
scanf
(
"%d"
,&j);
//printf("%d ",k);
do
{
printf
(
"\n请输入您需要的任务的序号"
);
printf
(
"\n1:朴素的模式匹配算法"
);
printf
(
"\n2:快速模式匹配算法"
);
printf
(
"\n3:退出\n"
);
scanf
(
"%d"
,&id);
switch
(id){
case
1:
{
printf
(
"\n\n你调用了功能1:"
);
printf
(
"\n朴素的模式匹配算法"
);
k=Index(A,B,j);
printf
(
"\n该位置为:"
);
printf
(
"%d\n"
,k);
break
;}
case
2:
{
printf
(
"\n\n你调用了功能2:"
);
printf
(
"\n 快速模式匹配算法"
);
a=Index_KMP(A,B,j);
printf
(
"\n该位置为:"
);
printf
(
"%d\n"
,a);
break
;}
case
3:
{
printf
(
"\n\n你调用了功能3:"
);
printf
(
"\n退出\n"
);
}
}
}
while
(id!=3);
}
|
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持! 。
最后此篇关于C语言数据结构中串的模式匹配的文章就讲到这里了,如果你想了解更多关于C语言数据结构中串的模式匹配的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
使用sed和/或awk,仅在行包含字符串“ foo”并且行之前和之后的行分别包含字符串“ bar”和“ baz”时,我才希望删除行。 因此,对于此输入: blah blah foo blah bar
例如: S1: "some filename contains few words.txt" S2:“一些文件名包含几个单词 - draft.txt” S3:“一些文件名包含几个单词 - 另一个 dr
我正在尝试处理一些非常困惑的数据。我需要通过样本 ID 合并两个包含不同类型数据的大数据框。问题是一张表的样本 ID 有许多不同的格式,但大多数都包含用于匹配其 ID 中某处所需的 ID 字符串,例如
我想在匹配特定屏幕尺寸时显示特定图像。在这种情况下,对于 Bootstrap ,我使用 col-xx-## 作为我的选择。但似乎它并没有真正按照我认为应该的方式工作。 基本思路,我想显示一种全屏图像,
出于某种原因,这条规则 RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*
我想做类似的东西(Nemerle 语法) def something = match(STT) | 1 with st= "Summ" | 2 with st= "AVG" =>
假设这是我的代码 var str="abc=1234587;abc=19855284;abc=1234587;abc=19855284;abc=1234587;abc=19855284;abc=123
我怎样才能得到这个字符串的数字:'(31.5393701, -82.46235569999999)' 我已经在尝试了,但这离解决方案还很远:) text.match(/\((\d+),(\d+)\)/
如何去除输出中的逗号 (,)?有没有更好的方法从字符串或句子中搜索 url。 alert(" http://www.cnn.com df".match(/https?:\/\/([-\w\.]+
a = ('one', 'two') b = ('ten', 'ten') z = [('four', 'five', 'six'), ('one', 'two', 'twenty')] 我正在尝试
我已经编写了以下代码,我希望用它来查找从第 21 列到另一张表中最后一行的值,并根据这张表中 A 列和另一张表中 B 列中的值将它们返回到这张表床单。 当我使用下面的代码时,我得到一个工作表错误。你能
我在以下结构中有两列 A B 1 49 4922039670 我已经能够评估 =LEN(A1)如2 , =LEFT(B1,2)如49 , 和 =LEFT(B1,LEN(A1)
我有一个文件,其中一行可以以 + 开头, -或 * .在其中一些行之间可以有以字母或数字(一般文本)开头的行(也包含这些字符,但不在第 1 列中!)。 知道这一点,设置匹配和突出显示机制的最简单方法是
我有一个数据字段文件,其中可能包含注释,如下所示: id, data, data, data 101 a, b, c 102 d, e, f 103 g, h, i // has to do with
我有以下模式:/^\/(?P.+)$/匹配:/url . 我的问题是它也匹配 /url/page ,如何忽略/在这个正则表达式中? 该模式应该: 模式匹配:/url 模式不匹配:/url/page 提
我有一个非常庞大且复杂的数据集,其中包含许多对公司的观察。公司的一些观察是多余的,我需要制作一个键来将多余的观察映射到一个单独的观察。然而,判断他们是否真的代表同一家公司的唯一方法是通过各种变量的相似
我有以下 XML A B C 我想查找 if not(exists(//Record/subRecord
我制作了一个正则表达式来验证潜在的比特币地址,现在当我单击报价按钮时,我希望根据正则表达式检查表单中输入的值,但它不起作用。 https://jsfiddle.net/arkqdc8a/5/ var
我有一些 MS Word 文档,我已将其全部内容转移到 SQL 表中。 内容包含多个方括号和大括号,例如 [{a} as at [b],] {c,} {d,} etc 我需要进行检查以确保括号平衡/匹
我正在使用 Node.js 从 XML 文件读取数据。但是当我尝试将文件中的数据与文字进行比较时,它不匹配,即使它看起来相同: const parser: xml2js.Parser = new
我是一名优秀的程序员,十分优秀!