0
已解决
周琪岳
资深光能
资深光能
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
string s1, a, b;
int ans, f[1005][1005];
int main() {
getline(cin, s1);
getline(cin, b);
for(int i=0; i<s1.size(); i++) {
memset(f, 0, sizeof(f));
a = s1.substr(i, s1.size() - i) + s1.substr(0, i);
int n = a.length(), m = b.length();
string a1 = " " + a;
string b1 = " " + b;
for(int j=1; j<=n; j++) {
for(int k=1; k<=m; k++) {
if(a1[j] == b1[k]) {
f[j][k] = f[j-1][k-1] + 1;
} else{
f[j][k] = max(f[j][k-1], f[j-1][k]);
}
}
}
ans = max(ans, f[n][m]);
}
cout << ans;
return 0;
}
在线求教,谢谢
周琪岳在2021-02-03 13:15:03追加了内容
@汪恺恒 我的意思是用线性DP写,不是套函数
0
0
汪恺恒
中级启示者
中级启示者
不用这么麻烦,一个字符串求子串的函数就搞定了
首先输入字符串
s1=a+a;//首尾相连
s2=b+b;
int len1=s1.size(),len2=s2.size();
if(len1>len2){//寻找最短的字符串
swap(s1,s2);
len1=s1.size();
len2=s2.size();
}
之后进行查找
循环(int i=0;i<=len1/2;i++){
循环(int j=1;j<=len1/2;j++){//枚举两个下标
int x=s2.find(s1.substr(i,j));//在s2中查找,截取的字符串是否存在
if(x!=-1){
if(j>ans){
ans=j;//更新最大长度
}
}
}
}
最后输出ans就AC了
//我的问题
0