我需要一个JavaScript答案,发现了一个C++ solution并对其进行了转换。希望其他人会觉得这很有用。
答案 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针对一大块随机数据。我不会想知道每个人的用例,所以为了速度,我会在这里留下我的答案。