什么是最长的,非重叠的重复子串,首先出现?

时间:2018-02-05 20:51:03

标签: javascript

我需要一个JavaScript答案,发现了一个C++ solution并对其进行了转换。希望其他人会觉得这很有用。

1 个答案:

答案 0 :(得分:0)

GeeksForGeeks转换过来:

function longestRepeatedSubstring( str ) {
    "use strict";

    var n = str.length
        , LCSRe = createArray( n + 1, n + 1 )
        , res = ''
        , res_length = 0
        , index = 0
    ;

    // Setting all to 0
    for( var i = 0; i < n + 1; i++ ) {
         LCSRe[ i ].fill( 0 );
    }

    // building table in bottom-up manner
    for( var i = 1; i <= n; i++ ) {
        for( var j = i + 1; j <= n; j++ ) {

            // (j-i) > LCSRe[i-1][j-1] to remove
            // overlapping
            if(
                str[ i - 1 ] === str[ j - 1 ]
                &&
                LCSRe[ i - 1 ][ j - 1 ] < ( j - i ) 
            ){
                LCSRe[ i ][ j ] = LCSRe[ i - 1 ][ j - 1 ] + 1;

                // updating maximum length of the
                // substring and updating the finishing
                // index of the suffix
                if( LCSRe[ i ][ j ] > res_length ) {
                    res_length = LCSRe[ i ][ j ];
                    index = Math.max( i, index );
                }

            } else {
                LCSRe[ i ][ j ] = 0;
            }
        }
    }

    // If we have non-empty result, then insert all
    // characters from first character to last
    // character of string
    if( res_length > 0 ) {
        for( var i = index - res_length + 1; i <= index; i++ ) {
            res = res.concat( str[ i - 1 ] );
        }
    }

    return res;
}



function createArray( length ) {
    var arr = new Array( length || 0 )
        , i = length
    ;

    if( arguments.length > 1 ) {
        var args = Array.prototype.slice.call( arguments, 1 );
        while( i-- ) {
            arr[ length - 1 - i ] = createArray.apply( this, args );
        }
    }

    return arr;
}

命名函数完成工作(由Matthew Crumley's createArray 辅助函数支持),但我当然欢迎优化建议。注意:由于这是从C ++转换而来的,所以我保留了原始变量名称以及大多数原始编码器的注释。

一些测试:

longestRepeatedSubstring( "SOgeeksforgeeks" );
> geeks

longestRepeatedSubstring( "aab" );
> a

longestRepeatedSubstring( "aabaabaaba" );
> aaba

longestRepeatedSubstring( "aaaaaaaaaaa" );
> aaaaa

longestRepeatedSubstring( "banana" );
> an 

要明确的是,我在发帖前错过了Ben Doom's的贡献。他使用正则表达式做同样的事情(使用循环)。在检查&#34; banana时,正则表达式解决方案可以轻松地优于循环解决方案,&#34;但loops run significantly faster针对一大块随机数据。我不会想知道每个人的用例,所以为了速度,我会在这里留下我的答案。