题目描述:
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发
生反转。
测试用例:
输入:"ab-cd"
输出:"dc-ba"
输入:"a-bC-dEf-ghIj"
输出:"j-Ih-gfE-dCba"
思路1(利用栈):
- 判断所给字符串是不是null,如果是null就直接返回nul;
-将S转为字符数组遍历,如果是字符就入栈;
-创建StringBuilder用来拼接反转后的字符;
- 将S转为字符数组遍历,如果是字符,就将它出栈并且用StringBuilder拼接,
否则直接用StringBuilder拼接;
代码如下:
import java.util.Stack;
class Solution {
public String reverseOnlyLetters(String S) {
if (S == null){
return null;
}
Stack<Character> stack = new Stack<>();
for (char ch : S.toCharArray()){
if (Character.isLetter(ch)){
stack.push(ch);
}
}
StringBuilder stringBuilder = new StringBuilder();
for (char ch : S.toCharArray()){
if (Character.isLetter(ch)){
stringBuilder.append(stack.pop());
}else {
stringBuilder.append(ch);
}
}
return stringBuilder.toString();
}
}
思路2(利用双指针):
- 创建一个StringBuilder负责拼接反转后的字符串;
- 定义一个left从S的0号位置向右遍历,定义一个right从右往左遍历;
代码如下:
class Solution {
public static String reverseOnlyLetters(String S) {
StringBuilder stringBuilder = new StringBuilder();
int right = S.length()-1;
for (int left = 0; left < S.length(); left++) {
if (Character.isLetter(S.charAt(left))){
while(!Character.isLetter(S.charAt(right))){
right--;
}
stringBuilder.append(S.charAt(right--));
}else {
stringBuilder.append(S.charAt(left));
}
}
return stringBuilder.toString();
}
}