2023.6.17
这题使用的是暴力解法,大致思路是用erase方法将字符串s和t中的#以及#之前的字符去除掉,最后对比两个字符串是否相同。
下面看下我略显冗余的代码:
class Solution {
public:
bool backspaceCompare(string s, string t)
{
//去除s中的#以及#之前的字符
for(int i=0; i<s.size(); i++)
{
while(s[0] == '#') s.erase(s.begin());
if(s[i] == '#')
{
s.erase(s.begin()+i);
s.erase(s.begin()+i-1);
i--;
i--;
}
}
//去除t中的#以及#之前的字符
for(int i=0; i<t.size(); i++)
{
while(t[0] == '#') t.erase(t.begin());
if(t[i] == '#')
{
t.erase(t.begin()+i-1);
t.erase(t.begin()+i-1);
i--;
i--;
}
}
//两字符串长度不相同,直接false
if(s.size() != t.size()) return false;
//两字符串都变空了,直接true
if(s.size()==0 && t.size()==0) return true;
//判断两字符串是否相同
for(int i=0; i<s.size(); i++)
{
if(s[i] != t[i])
{
return false;
}
}
return true;
}
};
双指针法:
class Solution {
public:
bool backspaceCompare(string s, string t) {
int i = s.size()-1;
int j = t.size()-1;
int skip_s = 0;
int skip_t = 0;
while(i>=0 || j>=0)
{
while(i>=0)
{
if(s[i] == '#')
{
skip_s++;
i--;
}
else if(skip_s)
{
skip_s--;
i--;
}
else break;
}
while(j>=0)
{
if(t[j] == '#')
{
skip_t++;
j--;
}
else if(skip_t)
{
skip_t--;
j--;
}
else break;
}
if(i>=0 && j>=0)
{
if(s[i] != t[j]) return false;
}
else if(i>=0 || j>=0) return false;
i--;
j--;
}
return true;
}
};
能理解 但是估计临场应该写不出来。
2023.9.7
时隔三个月,二刷。 想不明白当时怎么做的这么麻烦,直接重新定义两个string字符串s2和t2,然后将字符串s和t分别往里加入,遇到 ‘#’ 则删除刚加入的元素。 代码如下:
class Solution {
public:
bool backspaceCompare(string s, string t) {
string s2;
string t2;
for(int i=0; i<s.size(); i++)
{
if(s[i] != '#') s2 += s[i];
else
{
if(s2.size() != 0) s2.pop_back();
}
}
for(int i=0; i<t.size(); i++)
{
if(t[i] != '#') t2 += t[i];
else
{
if(t2.size() != 0) t2.pop_back();
}
}
if(s2 == t2) return true;
return false;
}
};