2015-06-21 63 views
0

看到所有人在Python中按照字母顺序讨论最长的子字符串,我决定在JS中尝试它。 函数应该查找给定字符串中最长的子字符串,其中字母按字母顺序排列。字母顺序中最长的子字符串Javascript

以下是我有:

var s = 'azcbobobegghakl' 
 

 
function substringChecker(s) { 
 
\t var longestSub = ""; 
 
\t for (var i = 0; i < s.length; i++) { 
 
\t \t var count = 0; 
 
\t \t var currSub = ""; 
 
\t \t while((i+count)<=s.length){ 
 
\t \t \t var curr = i+count; 
 
\t \t \t var next = curr+1; 
 
\t \t \t var prev = curr-1; 
 
\t \t \t if(curr !== s.length-1) { 
 
\t \t \t \t if(s[curr] <= s[next]){ 
 
\t \t \t \t \t currSub += s[curr] 
 
\t \t \t \t } else { 
 
\t \t \t \t \t break; 
 
\t \t \t \t } 
 
\t \t \t } else { 
 
\t \t \t \t if(s[curr]>s[prev]) { 
 
\t \t \t \t \t currSub += s[curr]; 
 
\t \t \t \t } 
 
\t \t \t } 
 
\t \t count++; 
 
\t \t } 
 
\t \t if(currSub.length >= longestSub.length) { 
 
\t \t \t longestSub = currSub; 
 
\t \t } 
 
\t }; 
 
\t return longestSub; 
 
} 
 
var result = substringChecker(s);; 
 
console.log(result);

它所有的测试情况下,我能想出的伟大工程的有趣的事情,但是这一次。结果应该是“乞讨”,而不是“乞丐”。为什么不显示,我错过了什么?

+0

其中“所有的人”你的意思是,你可以分享一个链接到该蟒蛇话题?我发现的唯一一个是从2013年开始的。 – Bergi

+0

WTH是否将该循环中的当前字符与前一个字符和下一个字符进行比较?你可能想尝试简化它。 – Bergi

+0

问题在于,如果它正在检查下一个字符,如果它仍然按字母顺序排列,但存储当前字符,所以您将始终错过最长字符串的最后一个字符(*除非它以原始*的最后一个字符结尾) 。但@Oriol [answer](http://stackoverflow.com/a/30967138)是一个更好的方法。 –

回答

1

该算法可以是线性的,我认为你过于复杂它放置循环内循环。

我会使用类似

function substringChecker(s) { 
 
    var longestSub = "", 
 
     length = 0, 
 
     start = 0, 
 
     prev = s[0]; 
 
    for (var i = 1; i <= s.length; ++i) { 
 
    if(i == s.length || s[i] < prev) { 
 
     if(length < i-start) { 
 
     longestSub = s.substring(start, i); 
 
     length = i-start; 
 
     } 
 
     start = i; 
 
    } 
 
    prev = s[i]; 
 
    }; 
 
    return longestSub; 
 
} 
 
document.write(substringChecker('azcbobobegghakl'));

相关问题