题目:给定 s
和 t
两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true
。#
代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
这道题我所知道的有两种解法:①快慢指针法;②栈。
①快慢指针法:
class Solution {
public:
// 判断经过退格操作后的两个字符串是否相等
bool backspaceCompare(string s, string t) {
// 对字符串 s 和 t 进行退格操作,得到实际字符串
string s1 = truth(s);
string t1 = truth(t);
// 比较两个实际字符串是否相等
return s1 == t1;
}
private:
// 对输入的字符串进行退格操作,返回经过退格操作后的实际字符串
string truth(string x){
int flow = 0; // 指示当前字符应该插入的位置
int n = x.size(); // 获取字符串的长度
// 遍历字符串
for(int fast = 0; fast < n; fast++) {
if(x[fast] != '#') { // 如果当前字符不是退格字符
x[flow] = x[fast]; // 将当前字符复制到实际字符串的指定位置
flow++; // 更新实际字符串的指针位置
} else { // 如果当前字符是退格字符
flow = max(flow - 1, 0); // 将指针前移一位,但不小于 0
}
}
// 返回经过退格操作后的实际字符串
return x.substr(0, flow); // 返回指定长度的子串,即经过退格操作后的实际字符串
}
};
substr()
是 C++ 中的一个字符串成员函数,用于从字符串中提取子串。它有两种形式的重载:
substr(pos, len)
:从字符串中提取从位置pos
开始,长度为len
的子串。substr(pos)
:从字符串中提取从位置pos
开始到末尾的子串。
②栈:
解题思路:
- 遍历字符串 s,遇到非退格字符就入栈,遇到退格字符就弹出栈顶元素(如果栈不为空)。
- 遍历字符串 t,同样地,遇到非退格字符就入栈,遇到退格字符就弹出栈顶元素(如果栈不为空)。
- 比较两个栈是否相等,如果相等则返回 true,否则返回 false。
class Solution {
public:
bool backspaceCompare(string s, string t) {
// 使用栈来模拟字符串编辑器的输入过程
stack<char> stack_s, stack_t;
// 对字符串 s 进行处理
for (char c : s) {
if (c != '#') {
stack_s.push(c); // 非退格字符入栈
} else if (!stack_s.empty()) {
stack_s.pop(); // 退格字符弹出栈顶元素
}
}
// 对字符串 t 进行处理
for (char c : t) {
if (c != '#') {
stack_t.push(c); // 非退格字符入栈
} else if (!stack_t.empty()) {
stack_t.pop(); // 退格字符弹出栈顶元素
}
}
// 比较两个栈是否相等
return stack_s == stack_t;
}
};
谢谢大家,继续努力。