忙完实验又两天,继续学习数据结构。
今天先学串的基本操作,最基础的有:获取长度,复制,连接,打印,简单匹配。
前面几个不用多说,就说说简单匹配吧。
简单匹配是相对于KMP算法而言的,简言之就是从子串的第一个字符开始和主串标记位开始的每一个字符进行对比,如果不完全匹配就将子串移到主串的下一个位置。
这个算法思路清晰,实现容易,但是很容易在遇到极端问题时浪费大量的时间,比如在主串最后才完成匹配这种情况,效率并不是很高。
因此就有了KMP算法,可以更加高效地实现字符串的匹配。于是我准备单独拿一篇博客来写KMP算法,毕竟是重点的重点。这一篇博客里就简单讲讲串的基本操作和简单匹配。
实现代码:
//串的基本操作:获取长度,复制,连接,打印,简单匹配
#include<stdio.h>
#define MAXSIZE 20
#define OK 1
#define ERROR 0
typedef int Status;
typedef char String[MAXSIZE];
//求字符串的长度
int StrLength(String S)
{
int i;
for(i=0; i<MAXSIZE; i++)
{
if(S[i] == '\0')
break;
}
return i;
}
//将S串复制到T串上
void StrCopy(String S, String T)
{
int i;
int length = StrLength(S);
for(i=0; i<length; i++)
T[i] = S[i];
T[i] = '\0';
}
//将S和T连接起来存入R中
Status StrCat(String S, String T, String R)
{
if(StrLength(S) + StrLength(T) > MAXSIZE)
{
printf("连接串长度超过了最大值...");
return ERROR;
}
int i, j=0;
for(i=0; i<StrLength(S); i++){
R[j] = S[i];
j++;
}
for(i=0; i<StrLength(T); i++){
R[j] = T[i];
j++;
}
return OK;
}
//打印字符串S
void PrintString(String S)
{
int i;
int length;
length = StrLength(S);
for(i=0; i<length; i++)
{
printf("%c", S[i]);
}
printf("\n");
}
//简单匹配,返回S串从pos位置开始的和T匹配的第一个位置
int Index(String S, String T, int pos)
{
int i = pos;
int j = 0;
//在S和T长度范围内进行匹配
while(i < StrLength(S) && j < StrLength(T))
{
if(S[i] == T[j])//若匹配,则接着匹配下去
{
++i;
++j;
}else{//若不匹配,回到方才匹配的下一个位置
i = i-j+2;
j = 1;
}
}
//T字符串匹配完成,返回位置
if(j == StrLength(T))
return i - StrLength(T);
else
return 0;
}
int main()
{
String S = "Hello World ";
String T = "World";
String K = "Hello ";
String R;
printf("S length = %d\n", StrLength(S));
printf("S = ");
PrintString(S);
printf("T = ");
PrintString(T);
printf("K = ");
PrintString(K);
printf("T在S中第一次出现的位置是:%d\n", Index(S, T, 0));
if(StrCat(K, T, R)){
printf("将K和T连接存入R中,R为:");
PrintString(R);
}
return 0;
}
程序运行结果: