题解 | #最长公共子串#

最长公共子串

http://www.nowcoder.com/practice/f33f5adc55f444baa0e0ca87ad8a6aac

滑动窗口,同时记录最大长度位置的终止位置,最后求解子串。(题目中的优化策略很重要,就是len<Max时无需继续比较)

public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * longest common substring
     * @param str1 string字符串 the string
     * @param str2 string字符串 the string
     * @return string字符串
     */
    int start=0;
    int Max=0;
    string LCS(string str1, string str2) {
        // write code here
        int Max=0;
        int flag=0;
        int start1=0, start2=0;
        //移动str1
        for(int i=0;i<str1.size();i++){
            int len=min(str2.size(), str1.size()-i);
            if(len<Max){
                break;//优化
            }
            int res=getMax(str1, str2, i, len);
            if(res>Max){
                Max=res;
                start2=start;
            }
            
        }
        //移动str2
        for(int i=0;i<str2.size();i++){
            int len=min(str1.size(), str2.size()-i);
            if(len<Max){
                break;//优化
            }
            int res=getMax(str2, str1, i, len);
            if(res>Max){
                Max=res;
                start1=start;
                flag=1;
            }
        }
        //cout<<Max<<" "<<start1<<endl;
        return flag==0?str2.substr(start2-Max+1, Max):str1.substr(start1-Max+1, Max);
        
    }
    int getMax(string &str1, string &str2, int index, int len){
        int res=0;
        int max_len=0;
        for(int i=0;i<len;i++){
            //cout<<str1[index+i]<<" "<<str2[i]<<endl;
            if(str1[index+i]==str2[i]){
                res+=1;
            }
            else{
                res=0;
            }
            if(res>max_len){
                max_len=res;
                start=i;
                
            }
            //cout<<res<<" "<<Max<<endl;
        }
        return max_len;
    }
};
全部评论

相关推荐

今晚做笔试的还有机会约面吗?有听说后面做笔试的会被认为来华为的意愿度不是很高.....
ggrr:不会,华为笔试都要排队的。不是说想写就能发的。有的人投递晚了几天就排在后面写了。
投递华为技术有限公司等公司10个岗位
点赞 评论 收藏
分享
09-19 14:12
武汉大学 golang
并没有发笔试,只是顺延了两次,去看官网发现流程结束了
无敌忍耐王:三个工作日没人捞就自动结束了
投递美团等公司10个岗位
点赞 评论 收藏
分享
深夜焦虑难以入眠:直通终面也很稳了
点赞 评论 收藏
分享
用微笑面对困难:不是你千万别小看这家公司,他们的预估市值成倍上涨,三次在报告看见这个公司了,总之如果是给股权的话可以试试,未来没准真能发家致富哈哈哈哈
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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