在Java中,找到一个字符串中的最长回文子串

在一个字符串中找到最长的回文子字符串是一个非常常见的Java面试问题。要找出字符串中最长的回文子串,首先,我们需要确定如何实现这个逻辑。

给定一个字符串,找出其中最长的回文子字符串的算法。

这里的关键是,对于任何回文字符串的中间位置,如果我们向左和向右移动1个位置,得到的始终是相同的字符。例如12321,这里的中心位置是3,如果我们在两侧继续移动一个位置,我们得到2和1。我们将在我们的Java程序中使用相同的逻辑来找出最长的回文串。然而,如果回文串的长度是偶数,那么中心位置也是偶数。因此,我们需要确保在我们的程序中也进行了检查。例如12333321,这里的中心位置是33,如果我们在两侧继续移动一个位置,我们得到3、2和1。

在Java程序中查找字符串中的最长回文子串。

在我们的Java程序中,我们将使用中间位置mid对输入字符串进行迭代,并检查左右字符。我们将使用两个全局变量来保存回文串的起始和结束位置。我们还需要检查是否已经发现了更长的回文串,因为在给定的字符串中可能有多个回文串。这是最终的程序,在所有情况下都能很好地运行。

package com.Olivia.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;
	}

}
longest palindrome substring in a string in java
广告
将在 10 秒后关闭
bannerAds