给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。# 代表退格字符。
注意:如果对空文本输入退格字符,文本继续为空。
示例 1:
输入:s = “ab#c”, t = “ad#c”
输出:true
解释:s 和 t 都会变成 “ac”。
示例 2:
输入:s = “ab##”, t = “c#d#”
输出:true
解释:s 和 t 都会变成 “”。
示例 3:
输入:s = “a#c”, t = “b”
输出:false
解释:s 会变成 “c”,但 t 仍然是 “b”。
提示:
1 <= s.length, t.length <= 200
s 和 t 只含有小写字母以及字符 ‘#’
解法1:暴力破解
每出现一个‘#’时,反向查找不为‘#’的字符,替换为‘#’,最后找出不为’#'的字符
class Solution {
public:
void delChar(string &s) {
int i = 0;
while(i < s.length() ) {
if(s[i] == '#') {
int delIdx;
if(i == 0) { delIdx = 0; }
else { delIdx = i - 1; }
while(i<s.length() && s[i] == '#'){
while(s[delIdx] == '#'){ // 反向查找不为‘#’的字符
if(delIdx > 0) delIdx--;
else break; // 第0个,直接跳出
}
s[delIdx] = s[i];
i++;
}
}else{
i++;
}
}
}
bool backspaceCompare(string s, string t) {
delChar(s);
delChar(t);
string s1 = "";
string s2 = "";
for (auto &c : s){
if (c != '#'){
s1 += c;
}
}
for (auto &c : t){
if (c != '#'){
s2 += c;
}
}
return (s1 == s2);
}
};
解法2:使用栈
遍历s,遇到’#"出栈(栈有元素时),否则入栈
class Solution {
public:
string delChar(string s) {
string st; // 当作栈使用
for (auto & c : s){
if(c == '#'){
if(st.length() > 0)
st.pop_back();
}else{
st.push_back(c);
}
}
return st;
}
bool backspaceCompare(string s, string t) {
return delChar(s) == delChar(t);
}
};
解法三:双指针
快指针向前挪,如果遇到#,慢指针后退,否则将快指针所指字符移到慢指针处
class Solution {
public:
string delChar(string s) {
string ret;
int slow = 0;
int fast = 0;
for(; fast < s.length(); fast++){
if(s[fast] != '#'){
s[slow++] = s[fast]; // slow++,更新slow向前挪
}else{
if(slow == 0){ slow = 0; }
else{ slow--; }
}
}
return s.substr(0, slow);
}
bool backspaceCompare(string s, string t) {
return delChar(s) == delChar(t);
}
};
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/backspace-string-compare
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。