(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;
}