题目来源于力扣(LeetCode)
一、题目
题目相关标签:字符串
提示:
S.length <= 100
33 <= S[i].ASCIIcode <= 122
S
中不包含or
"
二、解题思路
-
定义左右指针,遍历字符串 s
-
左指针右移查找字母字符元素,为字母时,右指针左移查找字母字符元素
-
当左右指针均为字母字符元素时,完成交换
三、代码实现
public static String reverseOnlyLetters(String S) {
int left = 0;
int right = S.length() - 1;
char[] arr = S.toCharArray();
while (left < right) {
if (isLetter(arr[left])) {
// 左侧满足条件时,判断右侧
if (isLetter(arr[right])) {
// 右侧索引上字符也是字母时,交换
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left ++;
}
// 右侧向左侧移动
right --;
} else {
left ++;
}
}
return String.valueOf(arr);
}
// 判断字符是否是字母(大写与小写都算)
public static boolean isLetter(char a) {
return (a >= 'a' && a <= 'z') || (a >= 'A' && a <= 'Z');
}
四、执行用时
五、部分测试用例
public static void main(String[] args) {
String s = "ab-cd"; // output: "dc-ba"
// String s = "a-bC-dEf-ghIj"; // output: "j-Ih-gfE-dCba"
// String s = "Test1ng-Leet=code-Q!"; // output: "Qedo1ct-eeLg=ntse-T!"
String result = reverseOnlyLetters(s);
System.out.println(result);
}