"Coding Interview Guide" -- 括号字符串的有效性和最长有效长度

题目

  给定一个字符串str,判断是不是整体有效的括号字符串

  举例,str = "()",返回true;str = "(()())",返回true;str = "(())",返回true;

       str = "())",返回false;str = "()(",返回false;str = "()a()",返回false;

my:

 1     import java.util.Stack;
 2 
 3     public boolean my_isValid(String str)
 4     {
 5         if(str == null || str.equals(""))
 6         {
 7             return false;
 8         }
 9 
10         char[] cstr = str.toCharArray();
11         Stack<Character> stack = new Stack<>();
12         for(char c : cstr)
13         {
14             if(c == '(')
15             {    
16                 stack.push(c);
17             }
18             else if(c == ')')
19             {
20                 if(stack.empty())
21                 {
22                     return false;
23                 }
24                 stack.pop();
25             }
26             else
27             {
28                 return false;
29             }
30         }
31         return stack.empty() ? true : false;
32     }

时间复杂度:O(N),空间复杂度:O(N)

左老师:

 1     public boolean isValid(String str)
 2     {
 3         if(str == null || str.equals(""))
 4         {
 5             return false;
 6         }
 7 
 8         char[] chas = str.toCharArray();
 9         int count = 0;     // 简单地设置一个计数器
10         for(char c : chas)
11         {
12             if(c != '(' && c != ')')
13             {
14                 return false;
15             }
16             if(c == ')' && --count < 0)
17             {
18                 return false;
19             }
20             if(c == '(')
21             {
22                 count++;
23             }
24         }
25 
26         return count == 0;
27     }

时间复杂度:O(N),空间复杂度:O(1)

进阶题目

  给定一个括号字符串str,返回最长的有效括号子串的长度

  举例,str = "(()())",返回6;str = "())",返回2;str = "()(()()(",返回4

动态规划:

 1     public int maxLength(String str)
 2     {
 3         if(str == null || str.equals(""))
 4         {
 5             return 0;
 6         }
 7 
 8         char[] chas = str.toCharArray();
 9         int[] dp = new int[chas.length];
10         int pre = 0;
11         int res = 0;
12         for(int i = 1; i < chas.length; i++)
13         {
14             if(chas[i] == ')')
15             {
16                 pre = i - dp[i - 1] - 1;
17                 if(pre >= 0 && chas[pre] == '(')
18                 {
19                     dp[i] = dp[i - 1] + 2 + (pre > 0 ? dp[pre - 1] : 0);
20                 }
21             }
22             res = Math.max(res, dp[i]);
23         }
24         return res;
25     }

来源:左程云老师《程序员代码面试指南》

原文地址:https://www.cnblogs.com/OoycyoO/p/10994537.html