文章

10

粉丝

399

获赞

13

访问

96.3k

头像
最长公共子串
P1627 上海交通大学2018年机试题
发布于2020年3月23日 11:41
阅读数 10.3k

最开始看成了序列,搞了半天没通过。

这里我用了两个for循环,复杂度还是比较高

思路很简单,外层是第一个字符串一次遍历,内层是对第二个子串的循环。

这里有几个细节:

1.这里要求输出,对于子串倒是不难,长度容易求,记录首地址即可,对于子序列就比较麻烦,我想的是用一个二维数组来存储对应的dp[i][j]比较简单,

当然,这样空间复杂度比较高;

2.这里我没有采用动态规划,内层循环一开始如果用for循环也行,for(int j = 0;j< t.length();j++)这样在退出循环时,要更新j的值;

我用的while循环,感觉走偏了,值的更新改了很多次;

3.这个题相当于lcs的简化版,在不相等的地方,直接置0,背了lcs的模板的,应该很快就a了。

#include<iostream>
#include<string>
using namespace std;

int main(){
string s,t;

	while(cin>>s>>t){
        int fir = 0,len =0;
		int ls = s.length();
		int lt = t.length();
      for(int i = 0;i<ls;i++){
	      int j = 0;
          int k = 0;
         while(i+k<ls){
        if((s[i+k]>='0'&&s[i+k]<='9')||j==lt) break;
        while(j<lt){
        if(t[j]>='0'&&t[j]<='9'||s[i+k]!=t[j]){j++; break;}
        else {j++;k++;}
        }

        if(k>len){len = k;fir = i;}
        k=0;


      }
      }
      for(int j = 0;j<len;j++)
    ...
登录查看完整内容


登录后发布评论

暂无评论,来抢沙发