算法:917、 仅仅反转字母

问题

给定一个字符串 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();
    }

你可能感兴趣的:(算法题,字符串)