leetcode刷题之数组NO.5
Posted 知行曼路
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode刷题之数组NO.5相关的知识,希望对你有一定的参考价值。
1.题目
2.解法一:重构字符串法
2.1.思路分析
- 普通的字符串比较就是一个字符一个字符相比较,但是这个题目中的字符串特殊之处在于,最终真正要比较的字符串和给出的字符串是不一样的,因此我们想到将那些不用比较的字符删除,得到最终的字符串再比较。
2.2.算法描述
算法很简单,分为下面的两步:
- 首先建立两个栈来存储;
- 如果字符不是
#
,则入栈; - 如果字符是
#
且栈非空时,则出栈; - 等字符重构完毕,再进行比较。
2.3.代码实现
class Solution {
public:
bool backspaceCompare(string s, string t) {
bool result = true;
result = changeStr(s) == changeStr(t);
return result;
}
string changeStr(string s) {
string ret;
for (auto c : s) {
if (c != \'#\') {
ret.push_back(c);
} else if (!s.empty()) {
ret.pop_back();
}
}
return ret;
}
};
3.解法二:双指针法
4.总结
- 在使用重构字符串法解题时,实现用栈重构的时候,犯的错误就是没有思考出栈的时候要同时满足两个条件,一个是非空,一个是出现了特殊字符,而是把特殊字符的处理单独拎出来,这就使得逻辑不完善,有的测试用例得不到正确结果。
void changeStr(string & s, stack<int> & s_s) {
if (s[0] == \'#\') {
return;
}
for (int i = 0; i < s.size(); i++) {
if (s[i] != \'#\') {
s_s.push(s[i]);
} else {
s_s.pop();
}
}
}
- 如果使用C++来写的话,可以使用C++11的range for语句来代替for语句,这样的好处一是使用方便,二是防止溢出。
- 范围for:
for (循环变量:对象){ 执行语句 }
每一次迭代都会将对象的下一个元素拷贝给变量。
- 范围for:
本文来自博客园,作者:曼路的个人博客,转载请注明原文链接:https://www.cnblogs.com/manlujun/p/15643575.html
以上是关于leetcode刷题之数组NO.5的主要内容,如果未能解决你的问题,请参考以下文章