題目描述:
題解:
一、遞歸
每次檢查相鄰且成對出現的合法符號,有則刪除該對,直到沒有相鄰且成對出現的爲止。
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();
}
代碼看起來更簡潔,複雜度和方法二相同。