【LeetCode刷题记录】20. 有效的括号

题目描述:
在这里插入图片描述在这里插入图片描述
题解:
一、递归
每次检查相邻且成对出现的合法符号,有则删除该对,直到没有相邻且成对出现的为止。

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();
}

代码看起来更简洁,复杂度和方法二相同。

原创文章 23 获赞 0 访问量 974

猜你喜欢

转载自blog.csdn.net/weixin_42192493/article/details/105266990