• 2014阿里巴巴网上笔试题-文章3大标题-公共最长的字符串长度


    说明

    2014阿里巴巴网上笔试题-文章3大标题    首先。我没有参加阿里巴巴网上笔试题,所有的主题是叙述性说明来自别人。的分析。假设有什么不正确的地方还望不吝赐教。

    也希望大家可以有更好的办法,希望大家来能不吝赐教。

    题目描写叙述

    给定一个主字符串和一个匹配字符串。如今问你,找出 “主串中可匹配到的匹配串中子串的最大长度”,可能比較绕。举个样例吧

    主字符串       abcdefgsdff     记为A

    匹配字符串   abefgf               记为B

    要求的值就是  3   由于 A中有efg B中也有efg ,并且也是AB中公共最长字符串

    就是求两个字符串中连续公共最长字符串的长度。

    分析

    思路1.

           因为匹配穿B的长度有限,所以能够求出B的全部连续子串 (时间复杂度O(M^2)),然后用每个子串向主串匹配(每次操作最快O(N))。这样的思路的时间复杂度就是O(M^2*N),代码自行设计,此处不赘述。

    思路2.

          使用DP的方式,思路我就不说了。

          时间复杂度: O(M*N)

          空间复杂度:O(M)

         以下使用这样的思路实现的c++代码:

    #include <iostream>
    #include <string.h>
    using namespace std;
    #define SUBLEN 50
    #define MAINLEN 1000
    
    char str1[SUBLEN];  //匹配串
    char str2[MAINLEN]; //主串
    
    int tmp1[SUBLEN];   //辅助1
    int tmp2[SUBLEN];   //辅助2
    
    //数组复位
    void init(int * arr,int len){
        for(int i = 0 ; i < len ;i++)arr[i]=0;
    }
    
    /**
        计算主串中可匹配到的匹配串中子串的最大长度
        时间复杂度:O(m*n)
        空间复杂度:O(m)
    */
    int getMaxSubLen(){
        int maxLen = 0;
        for(int i = 0 ; i < strlen(str2);i++){
            if(i&1){
                for(int j = 0 ; j < strlen(str1) ; j++ ){
                    if(str2[i]==str1[j]){
                        tmp1[j+1] = tmp2[j] + 1;
                        if(maxLen < tmp1[j+1])maxLen = tmp1[j+1];
                    }else tmp1[j+1] = 0;
                }
            }else{
                for(int j = 0 ; j < strlen(str1) ; j++ ){
                    if(str2[i]==str1[j]){
                        tmp2[j+1] = tmp1[j] + 1;
                        if(maxLen < tmp2[j+1])maxLen = tmp2[j+1];
                    }else tmp2[j+1] = 0;
                }
            }
        }
        return maxLen;
    }
    /*
    asawdecsescdsfdrfrc    ascsesfdr
    sdjnfksdsdlkmfl       sjskm
    sdsdsdsdsdsdwwwww      sdswwwsdsdwwwww
    
    測试结果
    4
    2
    9
    */
    int main()
    {
        while(cin>>str2>>str1){
            init(tmp1,50);
            init(tmp2,50);
            cout<<getMaxSubLen()<<endl;
        }
        return 0;
    }
    

    是不是还有更好的算法?O(N)?

    好吧,这个问题好像就是 “最长公共子串”  看来自己退化的不行不行的了 

    这里有时间复杂度:O(m+n)的解法 

    http://blog.csdn.net/yysdsyl/article/details/4226630

    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    Spring5.0源码导入IDEA(一)
    适配器模式
    3.6常见查询示例
    3.5在批处理模式下使用mysql
    3.4获取有关数据库和表的信息
    3.3.4.9使用多个表
    3.3.4.8计数行
    3.3.4.7模式匹配
    3.3.4.6使用NULL值
    3.3.4.5日期计算
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4608238.html
Copyright © 2020-2023  润新知