文章

166

粉丝

68

获赞

883

访问

91.6k

头像
最长连续公共子序列 题解:滑动窗口解法

#include <bits/stdc++.h>

using namespace std;

int main() {
    string s1, s2;
    while (cin >> s1 >> s2) {
        int maxLen = 0; 
        string longestSubstr; 

        for (int i = 0; i < s1.length(); i++) {
            for (int j = 0; j < s2.length(); j++) {
                int len = 0; 
                
                while (i + len < s1.length() && j + len < s2.length() && s1[i + len] == s2[j + len]) {
                    len++;
                }
                
                if (len >= maxLen) {
                    maxLen = len;
                    longestSubstr = s1.substr(i, len);
                }
            }
        }
        cout<<maxLen<<endl<<longestSubstr<<endl;
    }
}

这个解法存在一些冗余,但是比较好写,核心代码是里面的三个循环,因为两个字符串的长度都很小,所以一可以这么写,然后需要注意的点就是,我们的循环逻辑,我们的目的是s2躺在那里,然后s1,从尾部对齐s2头部,然后直到s1头部对齐s2尾部,完成全部的匹配,这里采用的倒退法取s1,循环中,我们s1的开始是0 0与s2对齐的,然后随着j的增加,位置不断推向尾部,这之后i增加,j又变成了0...

登录查看完整内容


登录后发布评论

1 条评论
RingoCrystal
2025年3月14日 12:05

你完全可以理解成,两个全部的公共子串的匹配

赞(0)