简单DP问题
设两个字符串S1,S2,假设dp[i][j] 代表到S1的第i个字符及S2的第j个字符时,最大公共字串的数目
那么 if(S1[I] == S2[j]) dp[i][j] = d[i-1][j-1] + 1 else dp[i][j] = 0
代码如下:
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <cstring>
int main(){
string s1,s2;
int dp[100][100];
while(cin >> s1 >> s2){
int len1 = s1.length();
int len2 = s2.length();
memset(dp,0,sizeof(dp));
int ans = -1;
int pos = -1;
for(int i = 0;i < len1;i++)
for(int j = 0;j < len2;j++){
if(s1[i] == s2[j]){
if(i == 0 || j == 0)
dp[i][j] = 1;
else dp[i][j] = dp[i-1][j-1] + 1;
if(dp[i][j] > ans){
ans = dp[i][j];
pos = i;
}
}
else
dp[i][j] = 0;
}
printf("ans = %d\n",ans);
if(ans != -1)
cout << s1.substr(pos-ans+1,ans) << endl;
}
system("pause");
}
DP[][]二维数组空间是可以优化的,可以变成一位数组.DP是个二维矩阵,举例如下
--a b c
a 1 0 0(第一行)
b 0 2 0(第二行)
c 1 0 3(第三行)
d 0 0 0 (第四行)
我们发现矩阵中求第二行的元素依赖于第一行,第三行依赖于第二行,但是不依赖于第一行,第N行依赖于第N-1行,和其他行无关,所以可以只保存一位数组可以实现空间优化
#include <iostream>
using namespace std;
#include <cstdio>
#include <cstdlib>
#include <cstring>
int main(){
/* Çó×¹«¹²×Ó´® */
string s1,s2;
int dp[100];
while(cin >> s1 >> s2){
int len1 = s1.length();
int len2 = s2.length();
memset(dp,0,sizeof(dp));
int ans = -1;
int pos = -1;
for(int i = 0;i < len1;i++){
for(int j = len2-1;j >= 0;j--){
if(s1[i] == s2[j]){
if(i == 0 || j == 0)
dp[j] = 1;
else dp[j] = dp[j-1] + 1;
if(dp[j] > ans){
ans = dp[j];
pos = i;
}
}
else
dp[j] = 0;
}
}
printf("ans = %d\n",ans);
if(ans != -1)
cout << s1.substr(pos-ans+1,ans) << endl;
}
system("pause");
}
参考文献:http://blog.youkuaiyun.com/steven30832/article/details/8260189