题目描述:
题解:
一、递归
每次检查相邻且成对出现的合法符号,有则删除该对,直到没有相邻且成对出现的为止。
map<char, char> wordbook = {
{ ')', '(' },
{ ']', '[' },
{ '}', '{' }
};
bool isValid(string s) {
if (s.empty())return true;
if (s.size() % 2)return false;
int s_size = (int)s.size();
for (int i = 0; i < s_size; i++) {
if (wordbook[s[i + 1]] == s[i]) {
s.erase(s.begin() + i, s.begin() + i + 2);
break;
}
}
if (s_size == (int)s.size())return false;
return isValid(s);
}
复杂度分析:问题的规模每次减小2,每次遍历该字符串,时间复杂度O(n2);尾递归,理论上没有额外的堆栈操作,空间复杂度O(1);但是跑出来的结果内存占用却很大,why?
二、栈
利用栈的特性来解决问题,标准解法;思路简单,直接看代码。
map<char, char> wordbook = {
{ ')', '(' },
{ ']', '[' },
{ '}', '{' }
};
bool isValid(string s) {
if (s.size() % 2) return false;
stack<char> myStack;
for (int i = 0; i<s.length(); i++)
{
if (s[i] == '[' || s[i] == '{' || s[i] == '(')
myStack.push(s[i]);
else if (s[i] == ']' || s[i] == '}' || s[i] == ')')
{
if (myStack.empty()) return false;
if (wordbook[s[i]] == myStack.top())
{
myStack.pop();
continue;
}
else return false;
}
}
return myStack.empty();
}
复杂度分析:只遍历一次,时间复杂度O(n);最坏的情况下要将n/2个字符堆栈,空间复杂度O(n)。
三、用vector达到stack的效果
bool isValid(string s) {
if (s.size() % 2) return false;
vector<char> vecStack;
char c;
for (auto i : s) {
if (i == '}' || i == ')' || i == ']') {
if (!vecStack.empty()) c = vecStack[vecStack.size() - 1];
else return false;
if (i == '}' && c != '{') return false;
if (i == ')' && c != '(') return false;
if (i == ']' && c != '[') return false;
vecStack.pop_back();
}
else vecStack.push_back(i);
}
return vecStack.empty();
}
代码看起来更简洁,复杂度和方法二相同。