LeetCode917-仅仅反转字母

题目链接

英文链接:https://leetcode.com/problems/reverse-only-letters/

中文链接:https://leetcode-cn.com/problems/reverse-only-letters/

题目详述

给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。

示例 1:

1
2
输入:"ab-cd"
输出:"dc-ba"

示例 2:

1
2
输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"

示例 3:

1
2
输入:"Test1ng-Leet=code-Q!"
输出:"Qedo1ct-eeLg=ntse-T!"

提示:

  • S.length <= 100
  • 33 <= S[i].ASCIIcode <= 122
  • S 中不包含 \ or “

题目详解

运用双指针从两端向中间扫描,定位到字母,然后交换两个字母。

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
public class LeetCode_00917 {

public String reverseOnlyLetters(String S) {
char[] cs = S.toCharArray();
for (int i = 0, j = cs.length - 1; i < j; ++i, --j) {
while (i < j && !Character.isLetter(cs[i])) {
++i;
}
while (i < j && !Character.isLetter(cs[j])) {
--j;
}
if (i >= j) {
break;
}
swap(cs, i, j);
}
return String.valueOf(cs);
}

private void swap(char[] cs, int i, int j) {
char tmp = cs[i];
cs[i] = cs[j];
cs[j] = tmp;
}
}