题解 | #查找两个字符串a,b中的最长公共子串#

查找两个字符串a,b中的最长公共子串

https://www.nowcoder.com/practice/181a1a71c7574266ad07f9739f791506

#include<iostream>
#include<string>

using namespace std;

int main() {
    string a, b;
    getline(cin, a);
    getline(cin, b);
    if (a.size() > b.size()) {
        swap(a, b);//a为长度短的字符串
    }
    if (b.find(a) != string::npos) { //如果a在b中
        cout << a << endl;
    } else {
        int i, j;
        int count_ij = 1;//记录当前最长公共子串长度
        string s, t;
        for (i = 0; i < a.size(); ++i) {
            for (j = 1; j <= a.size() - i; ++j) {
                t = a.substr(i, j);//t: a[i]-a[i+j-1],一开始为a[0]
                if (b.find(t) == string::npos) { //t不在b里就中止循环
                    if (count_ij < t.size() - 1) { //t长度大于最长子串长度
                        s = a.substr(i, j - 1);
                        count_ij = s.size();
                    }
                    break;
                }
            }
            //已经遍历到最后一个字符但是t还在b里面
            if (j - 1 == a.size() - i) {
                if (count_ij < t.size()) {
                    s = t;
                    count_ij = s.size();
                }
                break;
            }
        }
        cout << s << endl;
    }
    return 0;
}

本题的思路是遍历较短的字符串,找到最长的公共子串

全部评论

相关推荐

白火同学:只是实习的话,你这份简历应该也差不多了。真要优化的话,因为面实习的话,没有开发经验,面试更重视技术栈水平。 1、重视JavaSE的基础吧,集合、泛型算是比较基础的基础,多线程、反射、JVM内存模型才是基础; 2、技术栈写到具体的点,比如Elasticsearch的使用写到某个点,限制面试官自由发挥,防止问了相关问题最后又答不上,如果真没把握建议不写,降低面试官的心理预期; 3、技术栈不要重复,比如技术栈第二条和第八条可以合并改为“熟悉Redis中间件,包括基本数据结构、缓存策略、持久化机制,了解缓存三剑客及其解决方案,并有相关项目经验。”; 4、项目指标量化,比如“达到xx秒的响应速度”(不过这个就有点偏校招社招的要求了,实习简历不写也无伤大雅)。
点赞 评论 收藏
分享
06-20 17:42
东华大学 Java
凉风落木楚山秋:要是在2015,你这简历还可以月入十万,可惜现在是2025,已经跟不上版本了
我的简历长这样
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务