最长公共子串问题空间复杂度为O(1)的解法

最长公共子串

http://www.nowcoder.com/questionTerminal/210741385d37490c97446aa50874e62d

图片说明
图是从左神的书里截的。这个思路很很巧妙。例如当前有如下两个串:
a b c d e
b e b c d
构造图4-10,图中的数值表就是二维dp[i][j]的值。dp[i][j]只与dp[i-1][j-1]有关。每一轮斜线扫描时,开始长度curLen = 0,如果对应i, j的字符相等,则curLen++,不同则又将curLen重置为0。相当于用curLen来代替dp[i][j],省下了O(m*n)的空间。

#include <string>
#include <iostream>
using namespace std;
string commonStr(string& s1, string& s2) {
    int n1 = s1.size();
    int n2 = s2.size();
    int starti = n1 - 1; //第一个字符串最后一个字符串开始
    int startj = 0;   //第二个字符串第1个字符开始,
    int targeti = -1; //最长公共子串在s1上的结束位置
    int maxLen = 0;//最长公共子串的长度
    int curLen = 0; //每一轮扫描时的实时公共子串最大长度
    while(startj < n2) {
        curLen = 0;
        for(int i = starti, j = startj; i < n1 && j < n2; i++, j++) {//从左往右按图4-10扫描斜线
            if(s1[i] == s2[j]) {//相同,则沿着斜线往右下走
                curLen++;
                if(curLen > maxLen) {//发现更长的子串,记录下来
                    maxLen = curLen;
                    targeti = i;
                }
            }
            else {//不同,则重置
                curLen = 0;
            }
        }
        if(starti > 0) {//行从n1-1变到0之后,不变
            starti--;
        }
        else {//行到0后,列的开始位置逐轮递增
            startj++;
        }
    }
    return maxLen == 0 ? "-1" : s1.substr(targeti - maxLen + 1, maxLen);
}
int main() {
    string s1, s2;
    cin >> s1 >> s2;
    cout << commonStr(s1, s2) << endl;
    return 0;
}
全部评论

相关推荐

被普调的六边形战士很高大:项目经历貌似和专业或者求职方向没大关系?
点赞 评论 收藏
分享
小厂面经,也是我的处女面(30min)1.自我介绍2.spring&nbsp;boot的自动装配原理(好多类和接口的单词都忘了全称是啥了,就说了记得的单词,流程应该说对了吧)3.有用过redis吗?主要是用在实现什么功能(说了技术派用redis的zset来实现排行榜)5.有了解过Redisson吗?讲一下对于分布式锁的了解以及在什么场景下应用(说了秒杀场景)6.对mysql有了解吗?包括它的索引优化和创建(把想起来的全说了)7.了解设计模式吗?比如单例模式,为什么要使用单例模式,它的优点是什么(昨天刚看的设计模式)8.工厂模式有了解吗?主要的使用场景是?(也是昨天刚看的)9.场景题:有7个服务器,需要在早上十点定时的向数据库中的用户表中的用户发短信,如果做到发送的消息不重复,且如果发送失败了需要知道是到哪个用户失败了,这样下次就直接从这个用户开始(我答了用spring&nbsp;task来实现定时,用分布式锁来保证只有一份服务器可以发送消息,用消息队列来存储消息,然后用消息确认机制来保证错误信息的记录,以及在数据库或者业务层面完成消息消费的幂等性)10.场景题:如果在系统启动的时间就将数据库的所有用户相关的信息都读到一个hashmap中(这个没啥思路,没答好)27届的投了一个星期终于有一个面试了,大部分公司都只招26的
inari233:已oc,拒了
查看9道真题和解析
点赞 评论 收藏
分享
评论
7
2
分享

创作者周榜

更多
牛客网
牛客企业服务