Автор оригинала: Pankaj Kumar.
Самая длинная подстрока палиндрома в строке-очень распространенный вопрос для интервью на Java . Чтобы узнать самый длинный палиндром в строке , прежде всего, нам нужно определить логику для этого.
Самая длинная подстрока палиндрома в строковом алгоритме
Ключевым моментом здесь является то, что с середины любой строки палиндрома, если мы перейдем вправо и влево на 1 место, это всегда один и тот же символ.
Например, 12321, здесь середина равна 3, и если мы будем продолжать двигаться на одну позицию с обеих сторон, мы получим 2, а затем 1. Мы будем использовать ту же логику в нашей java-программе, чтобы найти самый длинный палиндром.
Однако, если длина палиндрома четная, то средний размер также четный. Поэтому нам нужно убедиться, что в нашей программе это также проверяется. Например, 12333321, здесь середина равна 33, и если мы будем продолжать двигаться на одну позицию в обе стороны, мы получим 3, 2 и 1.
Самая длинная подстрока Палиндрома в строковой Java-программе
В нашей java-программе мы будем перебирать входную строку с 1-м местом и проверять правый и левый символ.
У нас будет две глобальные переменные, чтобы сохранить начальную и конечную позиции для палиндрома. Нам также нужно проверить, есть ли уже найденный более длинный палиндром, так как в данной строке может быть несколько палиндромов.
Вот окончательная программа, которая отлично работает для всех случаев.
package com.journaldev.util; public class LongestPalindromeFinder { public static void main(String[] args) { System.out.println(longestPalindromeString("1234")); System.out.println(longestPalindromeString("12321")); System.out.println(longestPalindromeString("9912321456")); System.out.println(longestPalindromeString("9912333321456")); System.out.println(longestPalindromeString("12145445499")); System.out.println(longestPalindromeString("1223213")); System.out.println(longestPalindromeString("abb")); } static public String intermediatePalindrome(String s, int left, int right) { if (left > right) return null; while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { left--; right++; } return s.substring(left + 1, right); } // O(n^2) public static String longestPalindromeString(String s) { if (s == null) return null; String longest = s.substring(0, 1); for (int i = 0; i < s.length() - 1; i++) { //odd cases like 121 String palindrome = intermediatePalindrome(s, i, i); if (palindrome.length() > longest.length()) { longest = palindrome; } //even cases like 1221 palindrome = intermediatePalindrome(s, i, i + 1); if (palindrome.length() > longest.length()) { longest = palindrome; } } return longest; } }
На рисунке ниже показан вывод вышеупомянутой самой длинной java-программы с палиндромом.
Мы можем улучшить приведенный выше код, переместив проверку палиндрома и длины в другую функцию. Однако я оставил эту часть для вас. 🙂
Пожалуйста, дайте мне знать, если есть какие-либо другие лучшие реализации или если это в любом случае не удастся.