串(string)是由零个或多个字符组成的有限序列,又名字符串。
1、串的比较
给定两个串:s="a1a2……an", t="b1b2……bm",当满足以下条件之一时,s<t。
①n<m,且ai=bi(i=1,2,...,n)。
例如当s="hap",t="happy",就有s<t。因为t比s多两个字母。
②存在k<min(m,n),是的ai=bi(i=1,2,...,k-1)ak<bk。
例如当s="happen", t="happy", 因为 t 第5个字母ASCII值为121,而s的ASCII第五个字母值为
101,所以s<t 。
2、串的存储结构
· 串顺序存储结构
字符串存放于定长数组当中。
· 串的链式存储结构
一个节点存放一个字符,会造成很大的空间浪费,因此可以考虑一个节点存放一个或多个字符,如果最后一个节点不满,可以
用非串值字符补全(如#)。
3、匹配模式算法
· 模式匹配算法
/*******匹配模式算法*******/
int Index(String S,String T,int pos)
{
int n,m,i;
String sub;
if(pos>0)
{
n=StrLength(S); //得到主串S的长度
m=StrLength(T); //得到主串T的长度
i=pos;
while(i<n-m+1)
{
SubString(sub,S,i,m);//取主串第i个位置,长度与T相等的子串给sub
if(StrCompare(sub,T)!=0)//如果两串不相等
++i;
else //如果两串相等
return i; //返回i的值
}
}
return 0; //若无子串与T相等,返回0
}
/*******朴素的模式匹配算法***********/
int Index(String S,String T,int pos)
{
int i=pos; //i用于主串S中当前位置下标,若pos不为1,则从pos位置开始匹配
int j=1; //j用于子串T中当前位置下标值
//若i小于S长度且j小于T的长度,这种算法是把长度值放在数组头
while(i<S[0]&&j<=T[0])
{
if(S[i]==T[j])//两字母相等则继续
{
++i;
++j;
}
else //指针后退重新开始匹配
{
i=i-j+2;//i退回到上次匹配首位的下一位
j=1; //j退回到子串T的首位
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}
/********KMP模式匹配算法********/
void get_next(String T,int *next)
{
int i,j;
i=1;
j=0;
next[1]=0;
while(i<T[0])//处T[0]表示串T长度
{
if(j==0||T[i]==T[j])//T[i]表示后缀的单个字符,T[j]表示前缀的单个字符
{
++i;
++j;
next[i]=j;
if(T[i]!=T[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=next[j];//若字符不相同,则j回溯
}
}
/*返回子串T在主串S中第pos个字符之后的位置。若不存在,则函数返回值为0*/
int Index_KMP(String S,String T,int pos)
{
int i=pos;//i用于主串S当前下标值,若pos不为1,则从pos位置开始匹配。
int j=1;//j用于子串T中当前位置下标值
int next[255];//定义一next数组
get_next(T,next);//对串T做分析,得到next数组
while(i<=S[0]&&j<=T[0])//若i小于S的长度且j小于T的长度,循环继续
{
if(j==0||S[i]==T[j])//两字母相等则继续,与朴素算法增加了j=0判断
{
++i;
++j;
}
else //指针后退从新开始匹配
{
j=next[j];//j退回合适的位置,i值不变
}
}
if(j>T[0])
return i-T[0];
else
return 0;
}
2602

被折叠的 条评论
为什么被折叠?



