Javaで文字列内の最長回文部分文字列

文字列内の最長の回文部分文字列は、非常に一般的なJavaの面接問題です。文字列内の最長の回文を見つけるには、まず、それを行うためのロジックを特定する必要があります。

文字列内の最長の回文部分文字列のアルゴリズム

ここでの鍵となるポイントは、回文の文字列の中央からそれぞれ右と左に1つずつ進んだ場合、常に同じ文字になるということです。例えば12321の場合、中央は3であり、両側に1つずつ進むと、2、1となります。このロジックをJavaのプログラムで最長の回文を見つけるために使用します。ただし、回文の長さが偶数の場合、中央の位置も偶数になります。したがって、プログラム内でこれも確認する必要があります。例えば、12333321の場合、中央は33であり、両側に1つずつ進むと、3、2、1となります。

文字列内における最長の回文の部分文字列を見つけるためのJavaプログラム

私たちのJavaプログラムでは、入力文字列を中央(mid)を1番目の位置として反復処理し、右と左の文字をチェックします。パリンドロームの開始位置と終了位置を保存するために2つのグローバル変数が必要です。また、指定された文字列には複数のパリンドロームが存在することがあるため、既に長いパリンドロームが見つかっているかどうかも確認する必要があります。すべてのケースに対して正常に動作する最終プログラムは次のとおりです。

package com.scdev.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

弊社のGitHubリポジトリから、完全なサンプルコードをダウンロードできます。

コメントを残す 0

Your email address will not be published. Required fields are marked *