记录简单dp应用,题目来自牛客网NC127 link.
最长公共子串
问题描述
给定两个字符串str1和str2,输出两个字符串的最长公共子串,如果最长公共子串为空,输出-1。
示例1
输入:“1AB2345CD”,“12345EF”
返回值:“2345”
思路
利用二维数组dp进行填表,寻找dp[i][j]的最大值maxlen,同时标记出寻找的子串最后一个字符的位置end,最后根据所找出的maxlen以及end的关系将最长公共子串返回。
代码:
class Solution {
public:
/**
* longest common substring
* @param str1 string字符串 the string
* @param str2 string字符串 the string
* @return string字符串
*/
string LCS(string str1, string str2) {
// write code here
int n=str1.size();
int m=str2.size();
int dp[n+1][m+1];
int maxlen=0,end=0;
for(int i=0;i<=n;i++)dp[i][0]=0;
for(int j=0;j<=m;j++)dp[0][j]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(str1[i-1]==str2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}
else{
dp[i][j]=0;
}
if(dp[i][j]>maxlen){
maxlen=dp[i][j];
end=j-1;
}
}
}
string ans;
if(maxlen==0)return "-1";
ans=str2.substr(end-maxlen+1,maxlen);
return ans;
}
};
总结
知识就是要不断地反复理解。每重新思考一次,总会有新的收获