그런데 ‘위 해법을 아예 코드 한 줄로 줄일 수는 없을까?’라는 생각을 할 수 있다.
자바 API에는 reverse() 메서드를 사용하는 StringBuilder 클래스가 있다. 이름에서 알 수 있듯이 reverse() 메서드는 주어진 문자열을 뒤집어 반환한다. 회문이라면 주어진 문자열과 그 문자열을 뒤집은 문자열이 같을 것이다.
public static boolean isPalindrome(String str) {
return str.equals(new StringBuilder(str).reverse().toString());
}
자바 8 함수형 스타일로 작성해도 코드는 단 한 줄이다. 0부터 주어진 문자열의 반만큼 IntStream을 정의한 후 다음과 같이 중간에서 만나는 방식(meet-in-the-middle)으로 글자들을 비교하는 프레디케이트(predicate)를 noneMatch() 단락(short-circuiting) 종결 연산으로 사용하면 된다.
public static boolean isPalindrome(String str) {
return IntStream.range(0, str.length() / 2)
.noneMatch(p -> str.charAt(p) !=
str.charAt(str.length() - p - 1));
}
다음으로 주어진 문자열에서 중복 문자를 어떻게 제거하는지 논하겠다.