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

代碼看起來更簡潔,複雜度和方法二相同。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章