1,题目要求
Given two strings S and T, return if they are equal when both are typed into empty text editors. # means a backspace character.
#表示退格,判断两个含有#的字符串是否相等。
2,题目思路
个人的想法世界创建两个vector,依次对两个字符串进行遍历并判断是否有退格符号#。如果有就利用pop_back()方法将vector最后的char删除。
另外需要注意的是,会有vector为空而出现了多个#符号,因此,需要对这种情况进行判断——即对vector是否为空进行单独的判断。
当然,这道题也可以用栈容器来进行实现,原理上是一样的。
如果是在O(n)时间和O(1)空间内完成,则见方法2。
在方法2中说使用的办法是对两个字符串从后往前进行遍历,定义的变量b是为了处理退格符号而设定的。最后的if判断语句的原理是,如果S[i] != T[j]而此时又没有遍历到结尾,说明两个字符串在进行退格之后也一定是不同的。(需要注意的是从后往前,因此可以这样直接比较)
3,程序源码
方法1:
class Solution {
public:
bool backspaceCompare(string S, string T) {
vector<char> s1, t1;
for(int i = 0;i<S.size();i++)
{
if(S[i] == '#' && !s1.empty())
s1.pop_back();
else if(S[i] == '#' && s1.empty())
continue;
else
s1.push_back(S[i]);
}
for(int i = 0;i<T.size();i++)
{
if(T[i] == '#' && !t1.empty())
t1.pop_back();
else if(T[i] == '#' && t1.empty())
continue;
else
t1.push_back(T[i]);
}
return s1 == t1;
}
};
方法2:
bool backspaceCompare(string S, string T) {
for (int i = S.length() - 1, j = T.length() - 1;;i--, j--){
for (int b = 0; i >= 0 && (b || S[i] == '#'); --i)
b += S[i] == '#' ? 1 : -1;
for (int b = 0; j >= 0 && (b || T[j] == '#'); --j)
b += T[j] == '#' ? 1 : -1;
if (i < 0 || j < 0 || S[i] != T[j])
return i == -1 && j == -1;
}
}