之前的思路有问题,只考虑到了( ) [ ] { } 、{( [ ] )},两种情况,忽略了 ( ( [ ] ) { } )这种复合情况。
新思路:利用栈数据结构解决该问题。又学到了新东西,嘿嘿
特殊情况:若字符串为空,返回true;若字符串为单数,返回false;若第一个字符为右括号,返回false!
算法:遍历字符串,遇到左括号,将其压入站内
遇到右括号, 取栈顶数据与之匹配:若成功,弹出栈顶数据继续判断下个字符,否则返回false
代码如下:
1 #include <iostream>
2 #include <string>
3 #include <stack>
4
5 using namespace std;
6
7 class Solution
8 {
9 public:
10 bool isValid(string s)
11 {
12 int val = s.length();
13 if (val == 0) return true;
14 else
15 if (val % 2 != 0) return false;//个数为奇数必为false
16 else
17 {
18 if (s[0] == ')' || s[0] == ']' || s[0] == '}')//若第一个字符为右括号,必为false
19 return false;
20 else
21 {
22 stack<char> space;//创建栈空间,遇到左括号,压栈;遇到右括号,将栈顶弹出与之比较。
23
24 for (int i = 0; i < val; i++)
25 {
26 if (s[i] == '(' || s[i] == '[' || s[i] == '{')
27 {
28 space.push(s[i]);
29 continue;
30 }
31 else
32 {
33
34
35 char temp;
36 temp = space.top();//将栈顶的值赋值给temp
37 //由于栈里均为左括号,这里使用了比较笨的方法,将其转换为右括号,再与s[i]比较
38 //可以写一个函数,实现
39 if (temp == '(')
40 temp = ')';
41 if (temp == '[')
42 temp = ']';
43 if (temp == '{')
44 temp = '}';
45
46 if (temp != s[i])//若栈顶数据与s[i]不匹配,则返回false,否则,弹出栈顶数据并继续循环
47 {
48 return false;
49 break;
50 }
51 else
52 {
53 space.pop();
54 continue;
55 }
56 57 }
58 }
59 if (space.empty())//所有循环结束,如栈为空,则表示一一匹配成功,返回true
60 return true;
61 else return false;
62 }
63 }
64 }
65 };
66
67 int main(){
68 bool result;
69 Solution sol;
70 string str = "(([]){})";
71 result = sol.isValid(str);
72 cout << result << endl;
73 int y;
74 cin >> y;
75 return 0;
76 }