最近有人问我这个问题。这是我(最终)提出的解决方案。我用JavaScript编写了代码,因为它在该语言中非常简单。
基本概念是,您在弦上行走以寻找可能的最小多字符回文(两个或三个字符)。一旦有了它,扩大双方的边界,直到不再是回文。如果该长度大于当前最长的长度,请存储并继续移动。
// This does the expanding bit.
function getsize(s, start, end) {
var count = 0, i, j;
for (i = start, j = end; i >= 0 && j < s.length; i--, j++) {
if (s[i] !== s[j]) {
return count;
}
count = j - i + 1; // keeps track of how big the palindrome is
}
return count;
}
function getBiggestPalindrome(s) {
// test for simple cases
if (s === null || s === '') { return 0; }
if (s.length === 1) { return 1; }
var longest = 1;
for (var i = 0; i < s.length - 1; i++) {
var c = s[i]; // the current letter
var l; // length of the palindrome
if (s[i] === s[i+1]) { // this is a 2 letter palindrome
l = getsize(s, i, i+1);
}
if (i+2 < s.length && s[i] === s[i+2]) { // 3 letter palindrome
l = getsize(s, i+1, i+1);
}
if (l > longest) { longest = l; }
}
return longest;
}
可以肯定地将其清理和优化一些,但是除了最坏的情况(字符串相同的字母)以外,它在所有情况下都应该具有相当好的性能。
O(n^2)
获取子字符串*O(n)
来检查它们是否是回文,总共是O(n^3)
?