遇到出入顺序的问题,可以用栈
方法 1:字母栈
想法和算法
将 s 中的所有字母单独存入栈中,所以出栈等价于对字母反序操作。(或者,可以用数组存储字母并反序数组。)
然后,遍历 s 的所有字符,如果是字母我们就选择栈顶元素输出。
class Solution: def reverseOnlyLetters(self, S: str) -> str: # 使用字母栈 letters = [c for c in S if c.isalpha()] ans = [] print(letters) for c in S: if c.isalpha(): ans.append(letters.pop()) else: ans.append(c) return "".join(ans)
方法 2:反转指针
想法
一个接一个输出 s 的所有字符。当遇到一个字母时,我们希望找到逆序遍历字符串的下一个字母。
所以我们这么做:维护一个指针 j 从后往前遍历字符串,当需要字母时就使用它。
class Solution: def reverseOnlyLetters(self, S: str) -> str: # 反转指针 ans = [] j = len(S) - 1 for i, x in enumerate(S): if x.isalpha(): while not S[j].isalpha(): j -= 1 ans.append(S[j]) j -= 1 else: ans.append(x) return ''.join(ans)