力扣第917题:仅仅反转字母
- 题目描述:给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
- 示例 1:
输入:“ab-cd”
输出:“dc-ba”
- 示例 2:
输入:“a-bC-dEf-ghIj”
输出:“j-Ih-gfE-dCba”
- 示例 3:
输入:“Test1ng-Leet=code-Q!”
输出:“Qedo1ct-eeLg=ntse-T!”
这个题目有多种解法,例如双指针。但是呢,我觉得字母栈的方法是最巧妙的,先上代码:
class Solution {
public String reverseOnlyLetters(String S) {
Stack<Character> letters = new Stack();
for (char c: S.toCharArray())
if (Character.isLetter(c))
letters.push(c);
StringBuilder ans = new StringBuilder();
for (char c: S.toCharArray()) {
if (Character.isLetter(c))
ans.append(letters.pop());
else
ans.append(c);
}
return ans.toString();
}
}
将 s 中的所有字母单独存入栈中,所以出栈等价于对字母反序操作。然后,遍历 s 的所有字符,如果是字母我们就选择栈顶元素输出,如果不是字母,就拼接字符串中原本的内容。
道理其实很简单,但是代码里的知识需要做一点稍微的回顾:
- isLetter(char ch)用于判断括号里的内容,即ch是不是字母.
- ➢String: 不可变字符序列;
➢StringBuffer: 可变字符序列、效率低、线程安全;
➢StringBuilder: 可变字符序列、效率高、线程不安全 - append()方法是拼接,相当于"+",Stringbuffer和StringBuilder其实是动态字符串数组,append()是往动态字符串数组添加,如“x”+“y”相当那个‘+’号 。