C++编写算法实现串的置换操作Replace( S, T, R), 即将串S中所有与串T相等的子串置换为串R。

题目:.编写算法实现串的置换操作Replace( S, T, R), 即将串S中所有与串T相等的子串置换为串R。

实现代码:

#include<iostream>
#include <stdio.h>
using namespace std;
#define MaxSize 100
typedef struct
{	char data[MaxSize];
	int length;			//串长
} SqString;

void StrAssign(SqString &s, char cstr[])	//字符串常量赋给串s
{	int i;
	for (i = 0; cstr[i] != '\0'; i++)
		s.data[i] = cstr[i];
	s.length = i;
}

void DestroyStr(SqString &s)
{  }

void StrCopy(SqString &s, SqString t)	//串复制
{	int i;
	for (i = 0; i < t.length; i++)
		s.data[i] = t.data[i];
	s.length = t.length;
}

bool StrEqual(SqString s, SqString t)	//判串相等
{	bool same = true;
	int i;
	if (s.length != t.length)				//长度不相等时返回0
		same = false;
	else
		for (i = 0; i < s.length; i++)
			if (s.data[i] != t.data[i])	//有一个对应字符不相同时返回0
			{	same = false;
				break;
			}
	return same;
}

int StrLength(SqString s)	//求串长
{	return s.length;
}

SqString Concat(SqString s, SqString t)	//串连接
{	SqString str;
	int i;
	str.length = s.length + t.length;
	for (i = 0; i < s.length; i++)	//将s.data[0..s.length-1]复制到str
		str.data[i] = s.data[i];
	for (i = 0; i < t.length; i++)	//将t.data[0..t.length-1]复制到str
		str.data[s.length + i] = t.data[i];
	return str;
}

SqString SubStr(SqString s, int i, int j)	//求子串
{	SqString str;
	int k;
	str.length = 0;
	if (i <= 0 || i > s.length || j < 0 || i + j - 1 > s.length)
		return str;					//参数不正确时返回空串
	for (k = i - 1; k < i + j - 1; k++)  		//将s.data[i..i+j]复制到str
		str.data[k - i + 1] = s.data[k];
	str.length = j;
	return str;
}

SqString InsStr(SqString s1, int i, SqString s2)	//插入串
{	int j;
	SqString str;
	str.length = 0;
	if (i <= 0 || i > s1.length + 1) //参数不正确时返回空串
		return str;
	for (j = 0; j < i - 1; j++)      		//将s1.data[0..i-2]复制到str
		str.data[j] = s1.data[j];
	for (j = 0; j < s2.length; j++)		//将s2.data[0..s2.length-1]复制到str
		str.data[i + j - 1] = s2.data[j];
	for (j = i - 1; j < s1.length; j++)		//将s1.data[i-1..s1.length-1]复制到str
		str.data[s2.length + j] = s1.data[j];
	str.length = s1.length + s2.length;
	return str;
}

SqString DelStr(SqString s, int i, int j)		//串删去
{	int k;
	SqString str;
	str.length = 0;
	if (i <= 0 || i > s.length || i + j > s.length + 1) //参数不正确时返回空串
		return str;
	for (k = 0; k < i - 1; k++)       		//将s.data[0..i-2]复制到str
		str.data[k] = s.data[k];
	for (k = i + j - 1; k < s.length; k++)	//将s.data[i+j-1..s.length-1]复制到str
		str.data[k - j] = s.data[k];
	str.length = s.length - j;
	return str;
}

SqString RepStr(SqString s, int i, int j, SqString t)	//子串替换
{	int k;
	SqString str;
	str.length = 0;
	if (i <= 0 || i > s.length || i + j - 1 > s.length) //参数不正确时返回空串
		return str;
	for (k = 0; k < i - 1; k++)				//将s.data[0..i-2]复制到str
		str.data[k] = s.data[k];
	for (k = 0; k < t.length; k++)   		//将t.data[0..t.length-1]复制到str
		str.data[i + k - 1] = t.data[k];
	for (k = i + j - 1; k < s.length; k++)	//将s.data[i+j-1..s.length-1]复制到str
		str.data[t.length + k - j] = s.data[k];
	str.length = s.length - j + t.length;
	return str;
}

void DispStr(SqString s)	//输出串s
{	int i;
	if (s.length > 0)
	{	for (i = 0; i < s.length; i++)
			printf("%c", s.data[i]);
		printf("\n");
	}
}


void Getbiaohaoxiazhi(SqString t, int nextval[])
{	int j = 0, k = -1;
	nextval[0] = -1;
	while (j < t.length)
	{	if (k == -1 || t.data[j] == t.data[k])
		{	j++;
			k++;
			if (t.data[j] != t.data[k])
				nextval[j] = k;
			else
				nextval[j] = nextval[k];

		}
		else
			k = nextval[k];
	}
}

int KMPIndex1(SqString s, SqString t)
{	int nextval[MaxSize], i = 0, j = 0;
	Getbiaohaoxiazhi(t, nextval);
	while (i < s.length && j < t.length)
	{	if (j == -1 || s.data[i] == t.data[j])
		{	i++;
			j++;
		}
		else
			j = nextval[j];

	}
	if (j >= t.length)
		return (i - t.length);
	else
		return -1;
}

SqString Repalce(SqString S, SqString T, SqString R)
{	int i, flag = 1; //用于保存与串T相等的S串的下标起始值
	SqString str, str1; //str 返回值;str1 变动串
	str.length = 0;
	StrCopy(str1, S); //在str1上进行改动
	while (flag)
	{	i = KMPIndex1(str1, T);
		if (i == -1)
		{	flag = 0;
			break;//串S中没有与T相等的子串,退出
		}
		str = Concat(str, SubStr(str1, 1, i)); //第一次时将str1之前的字符连接在str上;第一次以后因为有修改str1.
		str = Concat(str, R); //连接替换内容
		StrCopy(str1, SubStr(str1, i + T.length + 1, str1.length - (i + T.length))); //将i+T.length之前的字符删去
	}

	str = Concat(str, str1); //循环中找不到等于T的子串后,将剩下的str1加到str尾部
	return str;
}

int main()
{	SqString S, T, R;
	char s[] = "我拿红豆比作友情,你拿红豆比作爱情。";
	char t[] = "红豆";
	char r[] = "长亭";
	StrAssign(S, s);
	StrAssign(T, t);
	StrAssign(R, r);
	SqString str;
	printf("串S:");DispStr(S);
	printf("串T:");DispStr(T);
	printf("串R:");	DispStr(R);
	str = Repalce(S, T, R);
	printf("替换后:");	DispStr(str);
	return 0;
}

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 1. 令i=0 2. 当s还存在子串t时,执行以下步骤: 1. 在s查找从位置i开始的子串t,并记录其起始位置为j 2. 删除s从j开始的长度为t.length的子串 3. 令i=j,重新开始查找 3. 返回删除后的s 算法说明: 本算法采用了“暴力匹配”的思想,即从左往右依次匹配子串。当发现和t相同的子串时,直接在s删除。然后从当前位置重新开始匹配,直到所有和t相同的子串都被删除。实现简单,时间复杂度为O(nm),其n是s的长度,m是t的长度。 以下是Python代码实现: def remove_substring(s, t): i = 0 while t in s[i:]: j = s.index(t, i) s = s[:j] + s[j+len(t):] i = j return s # 测试 s = "abababcdeababcde" t = "abc" print(remove_substring(s, t)) # Output: "de" ### 回答2: 编写算法,从s删除所有和t相同的子串,可以按照以下步骤进行: 1. 声明一个新的字符result,用于存储处理后的结果。 2. 定义两个指针i和j分别指向s的开头。 3. 遍历s,判断当前截取的子串是否与t相同。 - 如果相同,将指针i移动到子串的结尾,跳过该子串; - 如果不相同,将指针i指向的字符添加到result。 4. 返回result作为最终结果。 具体实现如下: ```python def remove_substring(s, t): result = "" i, j = 0, 0 while i < len(s): if s[i:i+len(t)] == t: i += len(t) else: result += s[i] i += 1 return result ``` 该算法的时间复杂度为O(n),其n为s的长度。算法通过遍历s,逐个判断子串是否与t相同,并将不相同的字符添加到结果。最后,返回处理后的结果。 ### 回答3: 编写算法,从s删除所有和t相同的子串可以按照以下步骤进行: 1. 初始化一个新的字符result,用于存储处理后的s。 2. 使用循环遍历s的每一个字符,假设当前字符是s[i]。 3. 检查从s[i]开始的子串是否和t相同,可以使用Strncmp函数进行比较。如果相同,则继续向后检查,直到遍历完整个t。 4. 如果从s[i]开始的子串t相同,则将索引i移动到从s[i]开始的子串的下一个字符处。 5. 如果从s[i]开始的子串t不相同,将s[i]添加到result,并将索引i移动到下一个字符处。 6. 重复步骤2-5,直到遍历完整个s。 7. 返回result作为处理后的s,即为删除所有和t相同的子串后的结果。 以下是算法的示例代码(使用C语言实现): ```c #include <stdio.h> #include <string.h> char* removeSubstrings(char* s, const char* t) { char* result = (char*)malloc(strlen(s) + 1); // 为result分配足够的内存 int i = 0; // s的索引 int j; // t的索引 while (s[i] != '\0') { // 检查从s[i]开始的子串是否和t相同 j = 0; while (s[i + j] == t[j] && t[j] != '\0') { j++; } // 如果从s[i]开始的子串t相同,将i移动到从s[i]开始的子串的下一个字符处 if (t[j] == '\0') { i += j; } // 如果从s[i]开始的子串t不相同,将s[i]添加到result,并将i移动到下一个字符处 else { result[strlen(result)] = s[i]; i++; } } result[strlen(result)] = '\0'; // 手动添加字符结尾标志 return result; } int main() { char s[] = "abdefabcdeabc"; const char t[] = "abc"; char* result = removeSubstrings(s, t); printf("%s\n", result); free(result); // 释放动态分配的内存 return 0; } ``` 运行结果为:`defde`。即删除了所有和t(`abc`)相同的子串后的结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值