串的算法举例

(1)给定顺序串S1和S2, 编写算法将串S2插入串S1的第i个字符

            int  InsertStr(SqString *S,SqString *S2 ,  int k);

 

1.

 算法一: 

 可以利用顺序串方式实现。原理是,分别创建串S1 , S2, 然后借助一个临时串进行插入,在设计算法时,首先将串S1

中指定插入位置后的所有字符复制到临时串中;其次将串S2复制到S1的指定位置上;最后将临时串中的所有字符复制到S1

串中,即完成插入;

算法二:

首先将串S1中指定插入位置后的所有字符往后移动S2->length长度,空出位置来,将S2插入到S1对应位置即可

int  InsertStr_1(SqString *S, SqString *S2, int k)
{
	int       j=0,i=0;
	if (k<0 || k>S->length) return ERROR;


	for ( i = S->length; i >=k-1; i--) {
		S->data[i+S2->length] = S->data[i];
	}
	S->data[S2->length+i]='\0';
	while (j<S2->length)
	{
		S->data[k-1+j] = S2->data[j];
		j++;
	}
	return OK;
}

int   InsertStr_2(SqString *S1, SqString *S2 , int k)
{
	int i, j, m = 0;
	SqString temp ,*t;
	t = &temp;
	InitString(t);
	 for ( i=0 ; i < S1->length; i++)
	 {
		 t->data[i] = S1->data[k-1+i];
	 }
	 t->data[i] = '\0';
	
	 for (j=0; j < S2->length; i++,j++) {
		 S1->data[k -1+j] = S2->data[j];
	 }
	 i = 0;
	 while (t->data[i]!='\0') {
		 S1->data[k+S2->length-1+i] = t->data[i];
		 i++;
	 }
	 S1->data[S1->length + S2->length] = '\0';
	 S1->length += S2->length;
	 return OK;

}

 (2)编写算法,用串S3替换串S1中存在的所有特定字串S2;

          int find_replace(SqString *s1 , SqString *s2 , SqString *s3);

 分析:

   分别创建串s1 , s2 ,s3  然后借助一个临时串,进行查处和替换. 在设计算法时,通过循环在串s1中查找

存在串s2的位置,可借助串的模式匹配算法,找到立即进行替换,直到全部替换接受

int find_replace(SqString *s1, SqString s2, SqString * s3) {

	int i, j, k = 0, m, n;
	SqString  temp, *t;
 	t = &temp;
   InitString(t);
   if (s1->length == 0 || s2.length == 0) return ERROR;
   for (i = 0; s1->data[i] != '\0'; i = j + s3->length - 1) {
	   j = index_bf(s1, s2, i);
	   if (j) {
		   for (m = 0; n = j + s2.length - 1; s1->data[n] != '\0'; m++, n--)
			   t->data[m] = s1->data[n];
		     t->data[m] = '\0';
			 for (m = j - 1, n = 0; s3->data[n] != '\0'; m++, n++)
				 s1->data[m] = s3->data[n];

			 s1->data[m] = '\0';
			 i = j + s3->length - 1;
			 for (m = i, n = 0; t->data[n] != '\0'; m++, n++)
				 s1->data[m] = '\0';
			 i = j + s3->length - 1;
			 for (m = i, n = 0; t->data[n] != '\0'; m++, n++)
				 s1->data[m] = t->data[n];
   			  s1->data[m] = '\0';

	   }
	   else  break;


   }




	return OK;
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值