-
题目:
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
链接:https://leetcode-cn.com/problems/reverse-only-letters/ -
思路:
可以使用双指针 i、j;i 从前往后遍历,j 从后往前遍历;
定义一个空字符串 res ;
从前往后遍历,当 S.charAt(i) 是字母时:指针 j 从后往前遍历,直到 S.charAt(j) 是字母时将其添加到字符串 res 尾部(若 S.charAt(j) 不是字母则继续遍历)
当 S.charAt(i) 不是字母时:将其添加到字符串 res 尾部 -
Character 类有一个方法:
boolean isLetter(char ch) // 用于判断指定字符是否为字母
- 代码:
public static String reverseOnlyLetters(String S) {
String res = "";
int j = S.length()-1;
for(int i = 0; i < S.length(); i++){
if(Character.isLetter(S.charAt(i))){
while (!Character.isLetter(S.charAt(j))) // 使用while循环,因为可能连续两个甚至多个字符不是字母
j--;
res += S.charAt(j--);
}else {
res += S.charAt(i);
}
}
return res;
}
-
另解:
将字母全部入栈,形成一个字母栈 letter ;
从前往后遍历字符串,若是字母则输出栈顶元素 -
代码:
public static String reverseOnlyLetters(String S) {
Stack<Character> letters = new Stack<>();
for(char c : S.toCharArray()){
if(Character.isLetter(c))
letters.push(c);
}
String res = "";
for(char c : S.toCharArray()){
if(Character.isLetter(c))
res += letters.pop();
else
res += c;
}
return res;
}