3 回答
TA贡献1995条经验 获得超2个赞
您可以使用最长的回文Manacher算法的O(n)时间!它的实现可以在这里和这里找到。
对于输入,String s = "HYTBCABADEFGHABCDEDCBAGHTFYW1234567887654321ZWETYGDE"它将找到正确的输出1234567887654321。
TA贡献1788条经验 获得超4个赞
据我了解的问题,我们可以在中心索引附近找到回文,并在中心的左右两侧进行搜索。鉴于此,并且知道输入的角落没有回文,我们可以将边界设置为1和length-1。注意字符串的最小和最大边界时,我们验证对称索引位置(右和左)上的字符对于每个中心位置是否都相同,直到达到最大上限中心。
外循环为O(n)(最多n-2次迭代),内循环为O(n)(最大(n / 2)-1次迭代)
这是我使用其他用户提供的示例的Java实现。
class LongestPalindrome {
/**
* @param input is a String input
* @return The longest palindrome found in the given input.
*/
public static String getLongestPalindrome(final String input) {
int rightIndex = 0, leftIndex = 0;
String currentPalindrome = "", longestPalindrome = "";
for (int centerIndex = 1; centerIndex < input.length() - 1; centerIndex++) {
leftIndex = centerIndex - 1; rightIndex = centerIndex + 1;
while (leftIndex >= 0 && rightIndex < input.length()) {
if (input.charAt(leftIndex) != input.charAt(rightIndex)) {
break;
}
currentPalindrome = input.substring(leftIndex, rightIndex + 1);
longestPalindrome = currentPalindrome.length() > longestPalindrome.length() ? currentPalindrome : longestPalindrome;
leftIndex--; rightIndex++;
}
}
return longestPalindrome;
}
public static void main(String ... args) {
String str = "HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE";
String longestPali = getLongestPalindrome(str);
System.out.println("String: " + str);
System.out.println("Longest Palindrome: " + longestPali);
}
}
其输出如下:
marcello:datastructures marcello$ javac LongestPalindrome
marcello:datastructures marcello$ java LongestPalindrome
String: HYTBCABADEFGHABCDEDCBAGHTFYW12345678987654321ZWETYGDE
Longest Palindrome: 12345678987654321
添加回答
举报