解题思路:
首先将每个字符串分割成单个单词,之后套用求最长公共子序列
(longest common sequence)的动态规划算法。
设两个单词序列分别为s1、s2,其中的单词用s1[i]、s2[i]表示。
dp[i][j]为用上前i个s1的单词,能在前j个s2的单词中找到的最长
公共子序列的长度。
当i=0或j=0时,dp[i][j]=0。
当i>0且j>0时,若s1[i]=s2[j],dp[i][j]=dp[i-1][j-1]+1。
当i>0且j>0时,若s1[i]≠s2[j],dp[i][j]=max{dp[i-1][j],dp[i][j-1]};
代码如下:
# include <stdio.h>
# include <string.h>
char temp[1005];
char s1[1005][1005]; //下标从1到cnt
char s2[1005][1005];
int cnt1,cnt2;
int dp[1005][1005];
int main()
{
//接受并处理两个字符串
gets(temp);
int cnt=0;
for(int i=0;i<strlen(temp);++i)
{
if(temp[i]>='A'&&temp[i]<='Z')
{
cnt=0;
s1[++cnt1][cnt++]=temp[i];
}
else
{
s1[cnt1][cnt++]=temp[i];
}
}
gets(temp);
cnt=0;
for(int i=0;i<strlen(temp);++i)
{
if(temp[i]>='A'&&temp[i]<='Z')
{
cnt=0;
s2[++cnt2][cnt++]=temp[i];
}
else
{
s2[cnt2][cnt++]=temp[i];
}
}
//求最大公共子序列
for(int i=1;i<=cnt1;++i)
{
for(int j=1;j<=cnt2;++j)
{
if(strcmp(s1[i],s2[j])==0)dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=dp[i-1][j]>dp[i][j-1]?dp[i-1][j]:dp[i][j-1];
}
}
printf("%d",dp[cnt1][cnt2]);
return 0;
}
算法详解可参考leetcode最长公共子序列官方题解以及大佬博客动态规划 最长公共子序列 过程图解