问题
给定一个字符串 S,返回 “反转后的” 字符串,其中不是字母的字符都保留在原地,而所有字母的位置发生反转。
输入:“ab-cd”
输出:“dc-ba”
输入:“a-bC-dEf-ghIj”
输出:“j-Ih-gfE-dCba”
输入:“Test1ng-Leet=code-Q!”
输出:“Qedo1ct-eeLg=ntse-T!”
自己解法 :将所有的字母存起来,反转,再把特殊字符插入进去
大概就像标题说的,我使用StringBuffer将字母都存起来,在使用reserve反转,插入特别字符
public String reverseOnlyLetters1(String S) {
// 想的是提取所有的字符,然后反转,最后将特殊字符插入进去
StringBuffer ans = new StringBuffer();
for(int i=0;i<S.length();i++){
if ((S.charAt(i)>=65 && S.charAt(i)<=90) || (S.charAt(i) >= 97 && S.charAt(i) <= 122)){
ans.append(S.charAt(i));
}
}
ans.reverse();
for(int i=0;i<S.length();i++){
if (!((S.charAt(i)>=65 && S.charAt(i)<=90) || (S.charAt(i) >= 97 && S.charAt(i) <= 122))){
ans.insert(i, S.charAt(i));
}
}
return ans.toString();
}
字母栈
将 s 中的所有字母单独存入栈中,所以出栈等价于对字母反序操作。(或者,可以用数组存储字母并反序数组。)
然后,遍历 s 的所有字符,如果是字母我们就选择栈顶元素输出。
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();
}