题目
(1)给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
(2)注意:如果对空文本输入退格字符,文本继续为空。
(3)示例如下:
输入:s = “ab#c”, t = “ad#c”
输出:true
解释:s 和 t 都会变成 “ac”。
解决思路
- 用栈s1和t1分别记录对字符串s和t根据要求转换后的结果。
- 然后逐位比较栈s1和t1对应的字符是否相等。
- 说明:遇到退格符#后,要删除退格符前面的一个字符,也即弹栈操作。
代码
- C++代码
# include <stdio.h>
# include <string>
# include <stack>
using namespace std;
class Solution {
public:
void transform(string S, stack<char> &st) {
for (int i = 0; i < S.size(); i++) {
// 遇到退格符,要弹出栈顶元素
if ('#' == S[i] && !st.empty()) {
st.pop();
} else if ('#' != S[i]) {
// 注意是else if ('#' != S[i])而不是else,如果写成else,则'#' == S[i] && st.empty()时,会将'#'好放入栈st中,从而产生错误。
st.push(S[i]);
}
}
}
bool backspaceCompare(string s, string t) {
stack<char> s1;
stack<char> t1;
// 将字符串s按照指定的规则转换后放到栈s1中
transform(s, s1);
transform(t, t1);
if (s1.size() != t1.size()) {
return false;
}
while (!s1.empty()) {
if (s1.top() != t1.top()) {
return false;
}
s1.pop();
t1.pop();
}
return true;
}
};
int main() {
string s = "ab#c";
string t = "ad#c";
Solution *solution = new Solution();
printf("%d\n", solution->backspaceCompare(s, t));
return 0;
}
- Python代码
# -*- coding: utf-8 -*-
from typing import List
class Solution:
def __init__(self):
pass
def transform(self, S: str, st: List):
for i in S:
# 遇到退格符,要弹出栈顶元素
if '#' == i and 0 != len(st):
st.pop()
# 注意是elif '#' != i而不是else,如果写成else,则'#' == i且st为空时,会将'#'好放入栈st中,从而产生错误。
elif '#' != i:
st.append(i)
def backspaceCompare(self, s: str, t: str) -> bool:
s1, t1 = [], [] # 使用list存放对字符串转换后的结果
# 将字符串s按照指定的规则转换后放到s1中
self.transform(s, s1)
self.transform(t, t1)
if len(s1) != len(t1):
return False
for i in range(len(s1)):
if s1[i] != t1[i]:
return False
return True
def main():
solution = Solution()
s = "ab#c"
t = "ad#c"
print(solution.backspaceCompare(s, t))
if __name__ == "__main__":
main()
说明
- 对应LeetCode第844题。
- 链接:https://leetcode-cn.com/problems/backspace-string-compare/