티스토리 뷰
[LeetCode - Daily Challenge] 1328. Break a Palindrome
Jaime.Lee 2021. 9. 23. 22:52Problem
Given a palindromic string of lowercase English letters palindrome, replace exactly one character with any lowercase English letter so that the resulting string is not a palindrome and that it is the lexicographically smallest one possible.
Return the resulting string. If there is no way to replace a character to make it not a palindrome, return an empty string.
A string a is lexicographically smaller than a string b (of the same length) if in the first position where a and b differ, a has a character strictly smaller than the corresponding character in b. For example, "abcc" is lexicographically smaller than "abcd" because the first position they differ is at the fourth character, and 'c' is smaller than 'd'.
Example 1:
Input: palindrome = "abccba"
Output: "aaccba"
Explanation: There are many ways to make "abccba" not a palindrome, such as "zbccba", "aaccba", and "abacba".
Of all the ways, "aaccba" is the lexicographically smallest.
Example 2:
Input: palindrome = "a"
Output: ""
Explanation: There is no way to replace a single character to make "a" not a palindrome, so return an empty string.
Example 3:
Input: palindrome = "aa"
Output: "ab"
Example 4:
Input: palindrome = "aba"
Output: "abb"
Constraints:
- 1 <= palindrome.length <= 1000
- palindrome consists of only lowercase English letters.
Solution
회문(palindrome, 거꾸로 읽어도 동일한 문자열)이 주어졌을 때, 한 문자만 바꿔서 회문을 깨는 문제입니다. 단, 한 문자만 바꾸는 경우의 수는 엄청 많을 수 있으니 알파벳 순으로 가장 가까운 문자열로 바꿔줘야 합니다.
한 문자를 바꿔서 회문을 깰 수 없다면 빈 문자열을 반환합니다.
회문을 바꾸는 것이기 때문에 문자열의 길이의 반까지만 검사하면서 알파벳 순으로 반환하기 위해 앞에서부터 'a'가 아닌 경우 'a'로 바꿔준 뒤 문자열을 반환해주면 됩니다.
만약 문자열 길이의 반까지 검사했는데 아무 것도 바뀌지 않았다면 모두 'a'라는 뜻이므로 맨 뒷자리를 'b'로 변환한 뒤 반환해줍니다.
public class Solution {
public String breakPalindrome(String palindrome) {
if (palindrome.length() <= 1) {
return "";
}
char[] chars = palindrome.toCharArray();
for (int i = 0; i < chars.length / 2; i++) {
if (chars[i] != 'a') {
chars[i] = 'a';
return String.valueOf(chars);
}
}
chars[chars.length - 1] = 'b';
return String.valueOf(chars);
}
}
Test
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertAll;
import static org.junit.jupiter.api.Assertions.assertEquals;
class SolutionTest {
@Test
void givenPalindrome_whenReplaceOneCharacter_thenBreakPalindrome() {
assertAll(
() -> test("abccba", "aaccba"),
() -> test("a", ""),
() -> test("aa", "ab"),
() -> test("aba", "abb")
);
}
private void test(String given, String expected) {
// when
Solution solution = new Solution();
String actual = solution.breakPalindrome(given);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode - Daily Challenge] 922. Sort Array By Parity II (0) | 2021.09.29 |
---|---|
[LeetCode - Daily Challenge] 1137. N-th Tribonacci Number (0) | 2021.09.24 |
[LeetCode Daily Challenge] 54. Spiral Matrix (0) | 2021.09.17 |
[LeetCode - Daily Challenge] 978. Longest Turbulent Subarray (0) | 2021.09.16 |
[LeetCode - Daily Challenge] 917. Reverse Only Letters (0) | 2021.09.15 |
- Total
- Today
- Yesterday
- 스프링 부트 애플리케이션
- 스프링부트
- @ManyToOne
- 함께 자라기
- Java
- gRPC
- spring boot jwt
- Spring Boot Tutorial
- 스프링 데이터 jpa
- r
- 스프링 부트 회원 가입
- JPA
- spring boot app
- 클린 아키텍처
- Spring Boot JPA
- proto3
- 함께 자라기 후기
- Linux
- Spring Boot
- 스프링 부트
- Spring Data JPA
- spring boot application
- 헥사고날 아키텍처
- intellij
- JSON
- Jackson
- 알고리즘
- leetcode
- 스프링 부트 튜토리얼
- QueryDSL
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |