Leetcode.1047 删除字符串中所有相邻重复项:
1047. 删除字符串中的所有相邻重复项 - 力扣(LeetCode)
本题可以利用栈的思想进行解答。但是此处并不是真正的去使用一个栈,而是利用来替代栈在本题中的作用。具体如下:
首先去遍历给定的字符串,如果为空,则将给定字符串的当前位置字符插入到中,即:
随后,再去检测给定字符串中的字符,如果其不等于中的最后一个字符,则也将这个字符插入,即:
此时再去检测给定字符串中的字符,由于这个字符与中的最后一个字符相同,则删除中的这个字符,即:
因此,整体逻辑就是,如果为空或者的最后一个字符与给定字符串的字符不同,则将给定字符串的字符插入到,否则则删除中的最后一个字符。具体代码如下:
class Solution {
public:
string removeDuplicates(string s) {
string str;
for(int i = 0; i < s.size(); i++)
{
if(str.empty() || s[i] != str.back())
{
str.push_back(s[i]);
}
else
{
str.pop_back();
}
}
return str;
}
};
Leetcode.20 有效的括号:
为了方便理解本题,下面给出三个示例:
对于上面给出的范例,不难发现,由于小括号的左半部分: 多了一个,因此不符合有效括号这一定义
对于上面给出的范例,不难看出,由于右括号多了若干个,因此也不满足有效括号的定义。
在大体了解了有效括号的定义后,下面给出题目解法:
首先创建一个栈,为了方便叙述,这里将这个栈命名为。
首先判断给定字符串的长度是否为偶数,如果不是,则直接返回即可。
遍历给定的字符串,如果位置的内容等于三种括号的左半部分,则向栈中压入这个括号的右半部分。如果位置的内容是三种括号的右半部分,则去和栈顶内容进行比较。
如果相等,则说明括号匹配,栈顶元素。如果不相等,则说明括号不匹配,直接返回
如果在遍历过程中,出现了栈为空的情况,则说明字符串中的括号的右半部分的数量大于左半部分,因此,返回。
在遍历完成后,在此对栈进行一次检测,如果此时栈为空,则说明给定字符串中的括号的左半部分的数量大于右半部分,返回。
对应代码如下:
class Solution {
public:
bool isValid(string s) {
if(s.size()%2 != 0)
{
return false;
}
stack<char> st;
for(int i = 0; i < s.size(); i++)
{
if(s[i] == '(')
{
st.push(')');
}
else if(s[i] == '[')
{
st.push(']');
}
else if(s[i] == '{')
{
st.push('}');
}
else if(st.empty() || s[i] != st.top())
{
return false;
}
else
{
st.pop();
}
}
if(!st.empty())
{
return false;
}
return true;
}
};
Leetcode.150 逆波兰表达式求值:
原理较为简单,首先创建一个栈,这里命名为。随后遍历给定的字符串数组,如果为运算符,则创建变量,用于存储两次出栈的元素。同时两次,删除栈中的这两个元素。随后,根据运算符,将运算后的解决压入栈中。
如果位置的字符不是运算符,则直接将压入栈中即可。对应代码如下:
class Solution {
public:
int evalRPN(vector<string>& tokens) {
stack<int> st;
for (int i = 0; i < tokens.size(); i++) {
if (tokens[i] == "+" || tokens[i] == "-" || tokens[i] == "*" || tokens[i] == "/")
{
int num1 = st.top();
st.pop();
int num2 = st.top();
st.pop();
if (tokens[i] == "+")
{
st.push(num2 + num1);
}
if (tokens[i] == "-")
{
st.push(num2 - num1);
}
if (tokens[i] == "*")
{
st.push(num2 * num1);
}
if (tokens[i] == "/")
{
st.push(num2 / num1);
}
}
else
{
st.push(stoi(tokens[i]));
}
}
int result = st.top();
return result;
}
};