说实话自己在尝试这道题的时候没什么清晰的思路和实现方法。
看了官方题解,官方提供了两种方法:
方法一:
这个重构字符串刚开始也想到了,但是不知道怎么去实现,看了官方题解后,不禁一颤,噢,这是栈的运用啊,仔细想想,也觉得退格带来的效果真的很像栈顶元素的弹出。
官方代码如下:
class Solution {
public:
bool backspaceCompare(string S, string T) {
return build(S) == build(T);
}
string build(string str) {
string ret;
for (char ch : str) {
if (ch != '#') {
ret.push_back(ch);
} else if (!ret.empty()) {
ret.pop_back();
}
}
return ret;
}
};
方法二:
官方代码如下:
class Solution {
public:
bool backspaceCompare(string S, string T) {
int i = S.length() - 1, j = T.length() - 1;
int skipS = 0, skipT = 0;
while (i >= 0 || j >= 0) {
while (i >= 0) {
if (S[i] == '#') {
skipS++, i--;
} else if (skipS > 0) {
skipS--, i--;
} else {
break;
}
}
while (j >= 0) {
if (T[j] == '#') {
skipT++, j--;
} else if (skipT > 0) {
skipT--, 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;
}
};
然后照着官方方法二敲代码的时候又踩了一个坑
我是这样写的
class Solution {
public:
bool backspaceCompare(string s, string t) {
int i = s.length() - 1, j = t.length() - 1;
int skips = 0, skipt = 0;
while (i >= 0 || j >= 0)
{
while (i >= 0)
{
if (s[i] == '#')
skips++, i--;
else if(skips > 0)
skips--, i--;
else
break;
}
while (j >= 0)
{
if (t[j] == '#')
skipt++, j--;
else if (skipt > 0)
skipt--, 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;
}
};
想着如果if或者else后面的语句只有一句就不用加大括号,简便一点,但是好心办坏事,不能ac,
原因就是if会自动和它最近的else语句自动组成if-else语句,才错了。
附上用方法二分析例子图片
其中这张图片是若大wile写成while (i >= 0 && j >= 0)
的一个不通过的案例,因为一定要两个字符串都走到头没出问题才说明真的没出问题,即要让两个字符串都走完,如果用while (i >= 0 && j >= 0)
的话,只要有一方走完了就退出大while了,就直接返回true了,并没有判断是否有一方还有剩余元素。如果大while写出while (i >= 0 || j >= 0)
的话,会通过这个大while里面的这段代码:
if (i >= 0 && j >= 0) {
if (S[i] != T[j]) {
return false;
}
} else {
if (i >= 0 || j >= 0) {
return false;
}
}
如果一方走完,一方还没走完(即还有元素剩余的话)就会进入else中的if语句,返回false。
标签:844,return,string,--,else,while,字符串,false,退格 From: https://www.cnblogs.com/hisun9/p/18540327