티스토리 뷰
Algorithm/LeetCode
[LeetCode - Daily Challenge] 917. Reverse Only Letters
Jaime.Lee 2021. 9. 15. 10:30Problem
Given a string s, reverse the string according to the following rules:
All the characters that are not English letters remain in the same position.
All the English letters (lowercase or uppercase) should be reversed.
Return s after reversing it.
Example 1:
Input: s = "ab-cd"
Output: "dc-ba"
Example 2:
Input: s = "a-bC-dEf-ghIj"
Output: "j-Ih-gfE-dCba"
Example 3:
Input: s = "Test1ng-Leet=code-Q!"
Output: "Qedo1ct-eeLg=ntse-T!"
Constraints:
- 1 <= s.length <= 100
- s consists of characters with ASCII values in the range [33, 122].
- s does not contain '"' or '\'.
Solution
문자열이 주어졌을 때 알파벳(대소문자)만 역순으로 출력하는 문제입니다.
정확히 반을 나눠서 대응하는 인덱스마다 swap 시켜주게되면 문자열도 같이 swap되기 때문에 이런 방식으로 접근하면 안 되고, 두 개의 포인터를 이용해 둘 다 알파벳인지 판단 후 두 문자를 swap 해주면 됩니다.
둘 중 하나라도 문자열이 아닌 경우 포인터를 움직여줘야 하고, 둘 다 아닐 경우 두 포인터 모두 움직여줘야 합니다.
public class Solution {
public String reverseOnlyLetters(String s) {
char[] chars = s.toCharArray();
int left = 0, right = chars.length - 1;
while (left < right) {
if (Character.isAlphabetic(chars[left]) && Character.isAlphabetic(chars[right])) {
char temp = chars[right];
chars[right] = chars[left];
chars[left] = temp;
left++;
right--;
} else if (Character.isAlphabetic(chars[left])) {
right--;
} else if (Character.isAlphabetic(chars[right])) {
left++;
} else {
left++;
right--;
}
}
return String.valueOf(chars);
}
}
스택을 이용한 방법도 있습니다.
public String reverseOnlyLetters(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (Character.isAlphabetic(c)) {
stack.push(c);
}
}
StringBuilder stringBuilder = new StringBuilder();
for (char c : s.toCharArray()) {
if (Character.isAlphabetic(c)) {
stringBuilder.append(stack.pop());
} else {
stringBuilder.append(c);
}
}
return stringBuilder.toString();
}
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 givenLetters_whenReverseOnlyLetters_thenCorrect() {
assertAll(
() -> test("ab-cd", "dc-ba"),
() -> test("a-bC-dEf-ghIj", "j-Ih-gfE-dCba"),
() -> test("Test1ng-Leet=code-Q!", "Qedo1ct-eeLg=ntse-T!")
);
}
private void test(String given, String expected) {
// when
Solution solution = new Solution();
String actual = solution.reverseOnlyLetters(given);
// then
assertEquals(expected, actual);
}
}
'Algorithm > LeetCode' 카테고리의 다른 글
[LeetCode Daily Challenge] 54. Spiral Matrix (0) | 2021.09.17 |
---|---|
[LeetCode - Daily Challenge] 978. Longest Turbulent Subarray (0) | 2021.09.16 |
[LeetCode - Daily Challenge] 1189. Maximum Number of Balloons (0) | 2021.09.14 |
[LeetCode - Daily Challenge] 764. Largest Plus Sign (0) | 2021.09.10 |
[LeetCode - Daily Challenge] 848. Shifting Letters (0) | 2021.09.09 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- spring boot jwt
- Linux
- intellij
- 함께 자라기
- 함께 자라기 후기
- 스프링 데이터 jpa
- 스프링부트
- spring boot application
- QueryDSL
- Spring Boot Tutorial
- leetcode
- 스프링 부트 회원 가입
- Spring Boot
- 스프링 부트
- gRPC
- proto3
- Jackson
- @ManyToOne
- 클린 아키텍처
- 스프링 부트 튜토리얼
- spring boot app
- r
- 스프링 부트 애플리케이션
- Spring Data JPA
- 헥사고날 아키텍처
- Java
- JSON
- 알고리즘
- JPA
- Spring Boot JPA
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함