本文共 1288 字,大约阅读时间需要 4 分钟。
为了解决这个问题,我们需要找到两个字符串的最大长度公共子序列的长度。子序列的定义是元素的顺序保持不变,但不需要连续。我们可以使用动态规划的方法来解决这个问题。
dp,其中dp[i][j]表示X的前i个字符和Y的前j个字符形成的最大长度公共子序列的长度。s1[i]等于s2[j]时,dp[i][j] = dp[i-1][j-1] + 1。否则,dp[i][j]取决于前面i-1,j和i,j-1的最大值。dp[i][j]为0,因为没有字符可以匹配。#include#include #include using namespace std;int main() { char s1[1005], s2[1005]; int len1, len2; while (scanf("%s %s", s1 + 1, s2 + 1) != EOF) { memset(dp, 0, sizeof(dp)); len1 = strlen(s1 + 1); len2 = strlen(s2 + 1); for (int i = 1; i <= len1; ++i) { for (int j = 1; j <= len2; ++j) { if (s1[i] == s2[j]) { dp[i][j] = dp[i-1][j-1] + 1; } else { dp[i][j] = max(dp[i-1][j], dp[i][j-1]); } } } printf("%d\n", dp[len1][len2]); } return 0;}
scanf函数读取输入的两个字符串,确保正确处理多个空格分隔的输入。memset初始化一个二维数组dp,其大小为1005 x 1005,以避免越界错误。dp数组。对于每个位置,如果当前字符相等,则取前左上角的值加1,否则取左边或上边的最大值。dp数组在最后一行的值,即两个字符串的最大长度公共子序列的长度。这种方法确保我们能够高效地计算出最大长度公共子序列的长度,时间复杂度为O(mn),其中m和n分别是两个字符串的长度。
转载地址:http://lwtj.baihongyu.com/