leetcode 20{}[]()

题目要求如下:

Given a string containing just the characters '('')''{''}''[' and ']', determine if the input string is valid.

The brackets must close in the correct order, "()" and "()[]{}" are all valid but "(]" and "([)]" are not.

这一题是典型的使用压栈的方式解决的问题,题目中还有一种valid情况没有说明,需要我们自己考虑的,就是"({[]})"这种层层嵌套但

以完全匹配的,也是valid的一种。解题思路是这样的:我们对字符串S中的每一个字符C,如果C不是右括号,就压入栈stack中。

如果C是右括号,判断stack是不是空的,空则说明没有左括号,直接返回not valid,非空就取出栈顶的字符pre来对比,如果是匹配

的,栈顶的字符,继续取S中的下一个字符;如果不匹配,说明不是valid的,直接返回。当我们遍历了一次字符串S后,注意

这里还有种情况,就是stack中还有残留的字符没有得到匹配,即此时stack不是空的,这时说明S不是valid的,因为只要valid,一

定全都可以到匹配使左括号弹出。


以下是我的代码,欢迎各位大牛指导交流~

AC,Runtime: 4 ms

[cpp]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. //LeetCode_Valid Parentheses  
  2. //Written by Zhou  
  3. //2013.12.28  
  4.   
  5. class Solution {  
  6. public:  
  7.     bool isValid(string s) {  
  8.           
  9.         stack<char> charStack;  
  10.         size_t i = 0;  
  11.           
  12.         while(i != s.length())  
  13.         {  
  14.             char c = s[i];  
  15.             if (c != ')' && c != '}' && c != ']')  
  16.             {  
  17.                 charStack.push(c);  
  18.             }  
  19.             else  
  20.             {  
  21.                 if (charStack.size() == 0)  
  22.                    return false;  
  23.   
  24.                 char pre = charStack.top();  
  25.                 switch(c)  
  26.                 {  
  27.                 case ')':  
  28.                     if (pre == '(')  
  29.                       charStack.pop();  
  30.                     else   
  31.                       return false;  
  32.                     break;  
  33.                         
  34.                 case '}':  
  35.                     if (pre == '{')  
  36.                       charStack.pop();  
  37.                     else   
  38.                       return false;  
  39.                     break;  
  40.                       
  41.                 case ']':  
  42.                     if (pre == '[')  
  43.                       charStack.pop();  
  44.                     else   
  45.                       return false;  
  46.                     break;  
  47.                 }  
  48.             }  
  49.             ++i;  
  50.         }  
  51.         if (charStack.size() == 0)  
  52.            return true;  
  53.         else return false;  
  54.     }  
  55. };  

### LeetCode 20 有效的括号 C++ 解法 对于 LeetCode20 题“有效的括号”,其核心在于通过栈的数据结构来验证输入字符串中的括号是否能够正确匹配。以下是基于栈的 C++ 实现方案: #### 方法概述 该方法利用栈的特点——先进后出(FILO),逐一遍历输入字符串 `s` 中的字符。如果当前字符是一个开括号,则将其压入栈中;如果是闭括号,则尝试从栈顶弹出一个对应的开括号进行匹配。最终,当遍历完成后,若栈为空则表示所有括号均成功匹配。 #### 具体实现代码 以下提供了完整的 C++ 实现代码[^2]: ```cpp class Solution { public: bool isValid(string s) { std::stack<char> m_stack; for (const auto& v : s) { if (m_stack.empty()) { m_stack.push(v); } else if (compare(m_stack.top(), v)) { m_stack.pop(); } else { m_stack.push(v); } } return m_stack.size() == 0 ? true : false; } private: bool compare(const char& c1, const char& c2) { return (c1 == '(' && c2 == ')') || (c1 == '[' && c2 == ']') || (c1 == '{' && c2 == '}'); } }; ``` 上述代码定义了一个名为 `Solution` 的类,并在其内部实现了成员函数 `isValid` 和辅助私有函数 `compare`。其中: - 函数 `isValid` 负责接收输入字符串并返回布尔值以表明括号序列是否有效。 - 辅助函数 `compare` 则用于检测两个字符是否构成一对合法的括号组合。 #### 复杂度分析 时间复杂度为 O(n),因为每个字符最多只会被压入和弹出一次堆栈操作。空间复杂度同样也是 O(n),最坏情况下整个字符串都需要存储到栈里[^4]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值