这段求解最长回文子串的JS代码时间复杂度是O(n³)吗?
最长回文子串代码时间复杂度O(n³)的原因解释
你给出的代码如下:
var longestPalindrome = function(s) { let maxString = ""; let originalString = s; let reversedString = s.split("").reverse().join(""); for (let i = 0; i < s.length; i++){ for (let j = i+1; j < s.length+1; j++){ if (i<j){ let iteratedSubstring = originalString.substring(i,j) if (reversedString.includes(iteratedSubstring) && (iteratedSubstring === iteratedSubstring.split("").reverse().join("")) ){ iteratedSubstring.length > maxString.length ? maxString = iteratedSubstring: maxString = maxString } } } } return maxString }
具体复杂度推导如下:
- 两层循环的时间量级为O(n²):两层循环的作用是枚举字符串所有可能的子串,当原串长度为n时,子串总数量为n*(n+1)/2,确实是O(n²)量级。
- 循环内部存在隐藏的*O(n)*时间操作:
- 回文判断逻辑
iteratedSubstring === iteratedSubstring.split("").reverse().join("")需要遍历子串的每一个字符,时间开销和子串长度成正比,最坏情况下子串长度等于原串长度n,这步的时间开销为O(n)。 - 额外的
reversedString.includes(iteratedSubstring)是冗余判断,JavaScript内置的字符串includes方法最坏时间复杂度同样为O(n),完全可以删除,能降低常数时间开销。
- 回文判断逻辑
- 总时间复杂度计算:总复杂度等于循环层数的复杂度乘循环内部操作的复杂度,即O(n²) * O(n) = O(n³)。
内容的提问来源于stack exchange,提问作者Divine Ogbuefi
相关产品推荐
相关产品推荐

