//串:它是有限字符集中的零个或多个字符组成的有限序列
//一种特殊的线性表
int indexz(String S,String T,int pos)
{
//T为非空串,若主串S中第pos个字符之后存在与T相等
//的子串,则返回第一个这样的子串在S中的位置
if(pos>0)
{
n=StrLength(S);//求出主字符串的长度
m=StrLength(T);//求出非空串的长度
i=pos;
while(i<=n-m+1)
{
SubString(sub,S,i,m);
if(StrCompare(sub,T)!=0)//依次让非空串和主串比较是否相等
i++;//如果不等,让非空串在主串上移动一位
else
return i;//如果找到相同的,就返回主串中的位置
}
}
return 0;
}
//1.定义串的定长
#define MAXSTRLEN 255//用户可在255内定义最大串长
Typedef unsigned char Sstring[MAXSTRLEN+1];//0号单元存放串的长度
//2.串链接:用T返回由S1和S2链接而成的新串,若未截断,返回TRUE
Status Concat(SString &T,SString S1,SString S2)
{
if(S1[0]+S2[0]<=MAXSTRLEN)//如果两个串长度之和小于新串T的长度
{
T[1...S1[0]=S1[1..S1[0]];//S1[0]表示最后一个元素,把S1中所有元素赋到T中
T[S1[0]+1..S1[0]+S2[0]]=S2[1...S2[0]];//把S2中元素赋到S1元素+1后面,正好链接
T[0]=S1[0]+S2[0];//最后T串长度就是两个串长度之和
uncut=TRUE;//没有被截断
}
else if(S1[0]<MAXSTRSIZE)
//第二种情况,S1长度小于T,但S1+S2大于T,这样,S1完全插入,而S2没有完全
{
T[1..S1[0]=S1[1...S1[0]];//把S1中的元素都赋到T中
T[S1[0]+1...MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]];//把S2中部分元素链接到S1后面
T[0]=MAXSTRLEN;//T的长度等于开始T的分配 长度
uncut=FALSE;//串被截断
}
else
//第三种情况,串T等于串S1的长度。
{
T[0...MAXSTRLEN]=S1[0...MAXSTRLEN];//把S1所有元素赋到T中
uncut=FALSE;//被截断
}
return uncut;
}
//3.求子串的函数
//用Sub返回串S的第POS个字符起长度为Len的子串
//1<=pos<=StrLength(s)且0<=len<=StrLength(S)-pos+1
Status SubString(Sstring &Sub,SString S,int pos,int len)
{
if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)//如果pos不合法或者长度溢出,
return ERROR;//返回错误
Sub[1..len]=S[pos..pos+len-1];//把符合情况的子串赋给新串
Sub[0]=len;//Sub[0]用来存放数组的长度
return OK;
}
//4。子串匹配算法。:返回子串T在主串S中第POS个字符之后的位置,
//若不存在,返回0
{
i=pos;//i为主串的移动指针
j=1;//J为在子串上移动的指针
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;
}
//5.串置换:将串"S"中所有子串"T"的出现都换成"v"
//在S中定位t,然后根据t和v二者的长度;
t.curlen<v.curlen:后移动v.curlen-t.curlen
t.curlen=v.curlen:替换
t.curlen>v.curlen:前移动t.curlen-v.curlen
//重复,直到s中不存在t为止
串操作算法虚拟实现
最新推荐文章于 2022-11-19 21:43:23 发布