웹사이트 검색

Java의 문자열에서 가장 긴 Palindrome 하위 문자열


문자열에서 가장 긴 팰린드롬 하위 문자열은 매우 일반적인 문자열입니다. 우선 이를 수행하기 위한 논리를 식별해야 합니다.

문자열 알고리즘에서 가장 긴 Palindrome 하위 문자열

여기서 핵심은 어떤 팰린드롬 문자열의 중간부터 오른쪽과 왼쪽으로 1칸 이동하면 항상 같은 문자라는 것입니다. 예를 들어 12321, 여기서 mid는 3이고 양쪽에서 한 위치를 계속 이동하면 2를 얻은 다음 1을 얻습니다. Java 프로그램에서 동일한 논리를 사용하여 가장 긴 회문을 찾습니다. 그러나 회문 길이가 짝수이면 중간 크기도 짝수입니다. 따라서 프로그램에서 이 항목도 확인해야 합니다. 예를 들어, 12333321, 여기서 mid는 33이고 양쪽에서 한 위치를 계속 이동하면 3, 2, 1이 됩니다.

문자열 Java 프로그램에서 가장 긴 Palindrome 하위 문자열

자바 프로그램에서 mid를 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;
	}

}

GitHub 리포지토리에서 전체 예제 코드를 다운로드할 수 있습니다.