Java에서 문자열이 회문인지 확인

1. 소개

이 기사에서는 Java를 사용하여 주어진 문자열 이 회문 인지 확인하는 방법을 살펴 보겠습니다 .

회문은 단어, 구, 숫자 또는 "madam"또는 "racecar"와 같이 앞으로와 동일한 뒤로 읽는 문자의 시퀀스입니다 .

2. 솔루션

다음 섹션에서는 주어진 문자열 이 회문인지 아닌지 확인하는 다양한 방법을 살펴 보겠습니다 .

2.1. 간단한 접근

주어진 문자열을 한 번에 한 문자 씩 앞뒤로 동시에 반복 할 수 있습니다 . 일치하는 항목이 있으면 루프가 계속됩니다. 그렇지 않으면 루프가 종료됩니다.

public boolean isPalindrome(String text) { String clean = text.replaceAll("\\s+", "").toLowerCase(); int length = clean.length(); int forward = 0; int backward = length - 1; while (backward > forward) { char forwardChar = clean.charAt(forward++); char backwardChar = clean.charAt(backward--); if (forwardChar != backwardChar) return false; } return true; }

2.2. 문자열 반전

이 사용 사례에 맞는 몇 가지 구현이 있습니다. 회문을 확인할 때 StringBuilderStringBuffer 클래스 의 API 메서드를 사용 하거나 이러한 클래스없이 String 을 반전 할 수 있습니다.

먼저 도우미 API가없는 코드 구현을 살펴 보겠습니다.

public boolean isPalindromeReverseTheString(String text) { StringBuilder reverse = new StringBuilder(); String clean = text.replaceAll("\\s+", "").toLowerCase(); char[] plain = clean.toCharArray(); for (int i = plain.length - 1; i >= 0; i--) { reverse.append(plain[i]); } return (reverse.toString()).equals(clean); }

위의 스 니펫에서 우리는 단순히 마지막 문자에서 주어진 문자열 을 반복하고 각 문자를 다음 문자에 추가하고 첫 번째 문자까지 끝까지 추가하여 주어진 문자열 을 뒤집습니다 .

마지막으로 주어진 문자열 과 반전 된 문자열이 같은지 테스트합니다 .

API 메서드를 사용하여 동일한 동작을 수행 할 수 있습니다.

간단한 데모를 보겠습니다.

public boolean isPalindromeUsingStringBuilder(String text) { String clean = text.replaceAll("\\s+", "").toLowerCase(); StringBuilder plain = new StringBuilder(clean); StringBuilder reverse = plain.reverse(); return (reverse.toString()).equals(clean); } public boolean isPalindromeUsingStringBuffer(String text) { String clean = text.replaceAll("\\s+", "").toLowerCase(); StringBuffer plain = new StringBuffer(clean); StringBuffer reverse = plain.reverse(); return (reverse.toString()).equals(clean); }

코드 스 니펫 에서 StringBuilderStringBuffer API 에서 reverse () 메서드를 호출 하여 주어진 문자열 을 반전시키고 동등성을 테스트합니다.

2.3. Stream API 사용

IntStream 을 사용하여 솔루션을 제공 할 수도 있습니다 .

public boolean isPalindromeUsingIntStream(String text) { String temp = text.replaceAll("\\s+", "").toLowerCase(); return IntStream.range(0, temp.length() / 2) .noneMatch(i -> temp.charAt(i) != temp.charAt(temp.length() - i - 1)); }

위의 스 니펫에서 우리는 문자열 의 각 끝에있는 문자 쌍이 술어 조건을 충족 하지 않는지 확인합니다 .

2.4. 재귀 사용

재귀는 이러한 종류의 문제를 해결하는 데 매우 널리 사용되는 방법입니다. 예제에서 우리는 주어진 문자열을 재귀 적으로 반복하고 그것이 회문인지 아닌지를 알아 내기 위해 테스트합니다 :

public boolean isPalindromeRecursive(String text){ String clean = text.replaceAll("\\s+", "").toLowerCase(); return recursivePalindrome(clean,0,clean.length()-1); } private boolean recursivePalindrome(String text, int forward, int backward) { if (forward == backward) { return true; } if ((text.charAt(forward)) != (text.charAt(backward))) { return false; } if (forward < backward + 1) { return recursivePalindrome(text, forward + 1, backward - 1); } return true; }

3. 결론

이 빠른 튜토리얼에서 우리는 주어진 문자열 이 회문 인지 아닌지 알아내는 방법을 보았습니다 .

항상 그렇듯이이 기사의 코드 예제는 GitHub에서 사용할 수 있습니다.