【2016-1】求最大公共字串长度
题目描述:给定两个字符串,求最大公共字串的长度,长度小于1000
分为两种问题:要求计算连续最长字串的长度
如下按照寻找连续的字串理解
输入:
1111hello2222
1133hello444
输出:
5
#include <iostream>
#include <string>
#include <math.h>
using namespace std;
#define maxn 1005
int dp[maxn][maxn];
int main(){
string s1, s2;
while(cin >> s1 >> s2){
int ans = 0;
memset(dp, 0, sizeof(dp));
s1 = "#"+s1; //空出0号位
s2 = "#"+s2;
for(int i=1; i<s1.size(); ++i){
for(int j=1; j<s2.size(); ++j){
if(s1[i]==s2[j]){
dp[i][j] = dp[i-1][j-1]+1;
ans = max(ans, dp[i][j]);
}
else{
dp[i][j]=0;
}
}
}
cout << ans << endl;
}
return 0;
}
- 定义dp[i][j]表示,s1以i为结尾的字串中,和s2以j为结尾的字串中,最长公共字符的个数是多少
- 123rrrr44dd与kkkk123rrrrdddddd的例子中,s1以dd结尾,最长有2个公共的,但是以rrrr结尾,最长有7个公共的,最长的情况在遍历完之前取到了,遍历所有两两搭配的结果,可以得到所有情况中的最长连续公共字串(1定义的可行性)
- 当s1[i]!=s2[j], 依据定义,dp[i][j]为0
- 当s1[i]==s2[j]时,dp[i][j] = dp[i-1][j-1]+1; 【。。。。。i-1】a【i】
- 与【。。。j-1】a【j】,a相同时,dp【i】【j】的长度取决于i-1及之前,与j-1及之前的长度
- 同类题型参考:https://leetcode-cn.com/problems/maximum-length-of-repeated-subarray/