PTA(动态规划)——两个字符串的最长公共子串长度(详细注释)

题目描述

求两个字符串的最长公共子串长度。

输入格式

输入长度≤100的两个字符串S和T。

输出格式

输出两个字符串的最长公共子串长度。

输入样例

ABCBDAB
BDCABA

ABACDEF
PGHIK

输出样例

2

0

Code

/*
 * @Description:
 * @version:
 * @Author:
 * @Date: 2021-04-24 14:46:37
 * @LastEditors: Please set LastEditors
 * @LastEditTime: 2021-04-24 15:45:57
 */
// 与教材不同的是,本题要求子序列是连续的。
#include <iostream>
#include <string>
using namespace std;
// x[]存储X序列
// y[]存储Y序列
// L[][]存储最长公共子序列的长度
#define n 100
#define m 100
int L[m + 1][n + 1]; // L[i][j]表示x[0] - x[i] 和 y[0] - y[j]的最长子序列长度
int CommonOrder(string x, string y)
{
	int i, j, k;
	// 初始化第0行
	for (j = 0; j <= x.length(); j++)
		L[0][j] = 0;
	// 初始化第0列
	for (i = 0; i <= y.length(); i++)
		L[i][0] = 0;
	// 在两个序列开始出加一个无用字符,方便字符串下标为1-len(str)
	x.insert(x.begin(), '1');
	y.insert(y.begin(), '2');
	// string maxstr;
	int max = 0;
	for (i = 1; i <= x.length(); i++)
		for (j = 1; j <= y.length(); j++)
        // 保证最近的两个字符是相等的,可以过滤掉一部分,否则,其实只有一个字符相等还按照这部分处理
			if (x[i] == y[j] && x[i - 1] == y[j - 1])
			{
				// 两个位置字符相等,则这个位置的最长公共子序列长度就是L[i-1][j-1]+1
				int temp = L[i - 1][j - 1] + 1;
				bool flag = true;
                // 当前保存了更大值
				if (temp > max)
				{
                    // 尝试把更大值给max
					max = temp;
                    // 检查是否它最近max个字符相同,不是则恢复max,按照另外的情况处理
					for (int k = 0; k < max; k++)
					{
						if (x[i - k] != y[j - k])
						{
							flag = false;
							max--;
						}
					}
				}
				if (flag)
					L[i][j] = temp;
				else
				{
					if (L[i][j - 1] >= L[i - 1][j])
						L[i][j] = L[i][j - 1];
					else
						L[i][j] = L[i - 1][j];
				}
			}
	// 否则记录L[i][j-1]与L[i-1][j]中的较大者,记录决策
			else if (L[i][j - 1] >= L[i - 1][j])
				L[i][j] = L[i][j - 1];
			else
				L[i][j] = L[i - 1][j];
	return L[x.length()][y.length()];
}
int main()
{
	string x, y;
	cin >> x >> y;
	cout << CommonOrder(x, y) << endl;
	system("pause");
	return 0;
}
### 关于删除字符串中的子串 在处理字符串操作时,可以利用C语言的标准库函数或者自定义逻辑来实现删除指定子串的功能。以下是基于PTA平台可能的需设计的一个解决方案。 #### 自定义函数实现删除子串功能 为了满足需,在给定的字符串中查找并删除目标子串,可以通过遍历源字符串的方式完成此任务。下面是一个完整的代码示例: ```c #include <stdio.h> #include <string.h> // 函数声明 void removeSubstring(char *str, const char *sub); int main() { char str[100], sub[50]; printf("请输入字符串:\n"); fgets(str, sizeof(str), stdin); str[strcspn(str, "\n")] = '\0'; // 去掉输入中的换行符 printf("请输入要删除的子串:\n"); scanf("%s", sub); // 输入子串 removeSubstring(str, sub); printf("修改后的字符串为:%s\n", str); return 0; } // 定义removeSubstring函数 void removeSubstring(char *str, const char *sub) { int lenSub = strlen(sub); if (lenSub == 0) return; // 子串为空则无需处理 char* pos = strstr(str, sub); // 查找第一次出现的位置 while (pos != NULL) { // 如果找到匹配项 memmove(pos, pos + lenSub, strlen(pos + lenSub) + 1); // 移动后续部分覆盖子串 pos = strstr(pos, sub); // 继续查找下一个位置 } } ``` 上述程序实现了从用户输入的一段文字中移除所有指定子串的操作[^3]。这里的关键在于使用`strstr()`定位到第一个匹配的目标子串地址,并通过内存移动(`memmove`)将其之后的内容向前挪动以填补被删去的部分。 #### 字符串清理方法补充说明 对于额外提到的方法如`strip()`、`rstrip()`以及`lstrip()`,它们主要用于去除空白字符或其他预设集合内的字符位于字符串开头或结尾处的情况[^1]。这些属于Python内置字符串方法范畴而非C/C++标准库支持范围之内。如果希望模拟类似行为,则需自行编写相应辅助工具函数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jian圣楠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值