Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中最长回文子串_Javascript_String_Time Complexity - Fatal编程技术网

Javascript中最长回文子串

Javascript中最长回文子串,javascript,string,time-complexity,Javascript,String,Time Complexity,我试图解决时间复杂度为O(N^2)的最长回文子串问题 问题: 给定一个字符串s,查找s中最长的回文子字符串。您可以假定s的最大长度为1000 例1: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. 例2: Input: "cbbd" Output: "bb" 我的解决方案: var longestPalindro

我试图解决时间复杂度为O(N^2)的最长回文子串问题

问题: 给定一个字符串s,查找s中最长的回文子字符串。您可以假定s的最大长度为1000

例1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
例2:

Input: "cbbd"
Output: "bb"
我的解决方案:

var longestPalindrome = function(s) {
    if(!s || s.length === 0)    return "";
    
    let start = 0;
    let end = 0;
    
    for(let i=0; i<s.length; i++) {
        let len1 = expand(s, i, i);
        let len2 = expand(s, i, i+1);
        let size = Math.max(len1, len2);
        if(size > end-start) {
            start = Math.floor(i - ((size-1) / 2));
            end = Math.floor(i + (size/2));
        }
    }
    
    return s.substring(start, end+1);
};

const expand = (str, left, right) => {
    let l = left;
    let r = right;
    while(l >= 0 && r < str.length && str[l] === str[r]) {
        l--;
        r++;
    }
    
    return r-l-1;
}
var longestPalindrome=函数{
如果(!s | | s.length==0)返回“”;
让start=0;
设end=0;
for(设i=0;i结束-开始){
开始=数学楼层(i-((尺寸1)/2));
结束=数学楼层(i+(尺寸/2));
}
}
返回s.substring(开始、结束+1);
};
常量展开=(str,左,右)=>{
设l=左;
设r=右;
而(l>=0&&r
我的解决方案对示例1有效,但对示例2无效。它返回“cbb”而不是“bb”。有人知道我做错了什么吗


感谢您仅提供说明:
下面的方法可行,但显然不是O(n^2)

[“巴巴德”、“甜点”、“最快的赛车是他的”、“复兴者”、“无聊”]。forEach(s=>
console.log(s+':'+longpal(s));
函数longpal(s){
设r=s.split(“”).reverse().join(“”);//反向字符串
设p,l,m=[0,0];/[pos,len]为最佳匹配
对于(p=0;pm[1];l--)
//记住p和l,只有当它是一个较长的匹配
如果(r.indexOf(s.substr(p,l))>-1)m=[p,l];
} 
返回s.substr(…m)
}
足够简单,请更换

start = Math.floor(i - ((size-1) / 2));


正如前面所述,您的复杂性将是O(n^2)
。如果您愿意,可以获得
O(n log(n))
,但这种技术要困难得多。它涉及到对语料库(输入字符串)进行散列,这样您就可以使用
O(n)
precomp在
O(1)
中获得子字符串散列,然后对每个起始字符(或相邻的一对类似字符)进行二进制搜索,找到该索引处的LPS(因此您还需要反向散列)。我相信你可以在网上找到更好的解释。德国劳埃德船级社

正如我在帖子中所说,我正在寻找一个O(n^2)解决方案。您的解决方案在嵌套的for循环中有一个indexOf,它不是O(n^2)是的,这是真的。我会再看看你的方法,但不知何故,我怀疑O(n^2)解决方案是否可行。我的想法是从中间开始,如果它们具有相同的字符,则向左和向右扩展,因为它是相同字符的回文O(n log(n))是可能的,cars10m
start = i - Math.floor((size-1) / 2);