其他分享
首页 > 其他分享> > 【字符串】678. 有效的括号字符串

【字符串】678. 有效的括号字符串

作者:互联网

题目:

 

 

解答:

这道题因为只需要判断是否可以构成有效的括号,并不需要列举出合法的解。
可以直接遍历一遍字符串,记录出现的括号和*的情况。

 1 class Solution {
 2 public:
 3      bool checkValidString(string s) 
 4      {
 5         // left和star分别记录出现的"("和"*"出现的index。
 6         vector<int>left,star;
 7 
 8         for(int i=0;i<s.size();i++)
 9         {
10             if(s[i]=='(') 
11             {
12                 left.push_back(i);
13             }
14             else if(s[i]=='*') 
15             {
16                 star.push_back(i);
17             }
18             else
19             {
20                 //当出现")"的时候,先判断left中是否有元素,有就直接pop,否则的话看看star里面是否有元素
21                 //如果都没有,那么就说明")"比"("和"*"都多,是非法解,返回false
22                 if(left.size()>0) 
23                 {
24                     left.pop_back();
25                 }
26                 else if(star.size()>0) 
27                 {
28                     star.pop_back();
29                 }
30                 else 
31                 {
32                     return false;
33                 }
34             }
35         }
36         //最后来判断"("是否合法,如果left的数量大于star,一定不合法,return false
37         if(left.size()>star.size()) 
38         {
39             return false;
40         }
41         //不然的话,就需要满足,对于任何一个左括号,它的右边必须至少有一个星号
42         //所以从后往前看,如果有一个左括号的右边没有星号,也就是star.back()<left.back() 就不合法
43         for(int i=left.size()-1;i>=0;i--)
44         {
45             if(star.back()<left.back()) 
46             {
47                 return false;
48             }
49             star.pop_back();
50             left.pop_back();
51         }
52         return true;
53     }
54 };

 

标签:678,back,return,括号,字符串,star,false,left
来源: https://www.cnblogs.com/ocpc/p/12826155.html