题目来源于知识星球—英雄算法联盟,六月算法集训专题
目录
前言
跟随英雄算法联盟博主—英雄哪里出来,每天完成相应的算法练习,一个月后,必定会有所成长!
一、剑指 Offer 31.栈的压入、弹出序列(中等)
1.题目描述
2.解题思路
定义两个指针 i 和 j ,i 指向 pushed 数组的当前元素,j 指向 popped 数组当
前的元素,每次循环时,pushed数组内的元素入栈,然后判断popped数组当
前的元素与栈顶元素是否相同,如果相同,则出栈,当前元素后移一位,当
pushed数组元素全部遍历完后,如果popped中仍有元素,返回false,否则
返回true。
3.代码演示(C++)
class Solution
{
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped)
{
int i = 0, j = 0;
stack<int> stk;
while(i < pushed.size() || j < popped.size())
{
if(i < pushed.size())
{
stk.push( pushed[i++] );
}
while(!stk.empty() && stk.top() == popped[j])
{
stk.pop();
++j;
}
if(i == pushed.size())
{
if(j < popped.size())
{
return false;
}
}
}
return true;
}
};
4.题目链接
二、946.验证栈序列(中等)
1.题目描述
2.解题思路
解题思路与第一题相同
3.代码演示(C++)
class Solution
{
public:
bool validateStackSequences(vector<int>& pushed, vector<int>& popped)
{
int i = 0, j = 0;
stack<int> stk;
while(i < pushed.size() || j < popped.size())
{
if(i < pushed.size())
{
stk.push( pushed[i++] );
}
while(!stk.empty() && stk.top() == popped[j])
{
stk.pop();
++j;
}
if(i == pushed.size())
{
if(j < popped.size())
{
return false;
}
}
}
return true;
}
};
4.题目链接
三、856.括号的分数(中等)
1.题目描述
2.解题思路
题目看起来很有意思,下次再战!
3.代码演示(C++)
4.题目链接
四、1190.反转每对括号间的子串(中等)
1.题目描述
2.解题思路
定义一个函数来计算字符串从某位置开始得到的反转字符串,遍历字符串,遇到
左括号,右括号和其他字符时单独处理,递归返回时,进行翻转。
3.代码演示(C++)
class Solution
{
int index;
string dfs(const string& s, int start)
{
string ret;
for(index = start; index < s.size(); ++index)
{
if(s[index] == '(')
{
string st = dfs(s, index + 1);
reverse(st.begin(), st.end());
ret += st;
}
else if (s[index] == ')')
{
return ret;
}
else
{
ret += s[index];
}
}
return ret;
}
public:
string reverseParentheses(string s)
{
return dfs(s, 0);
}
};
4.题目链接
总结
每天跟随英雄哥学习相关的算法,一个月会收获很多,如果你想了解更多关于知识星球的内容,欢迎联系我!