Leetcode 678.有效的括号字符串
有效的括号字符串
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
- 任何左括号 ( 必须有相应的右括号 )。
- 任何右括号 ) 必须有相应的左括号 ( 。
- 左括号 ( 必须在对应的右括号之前 )。
- * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
- 一个空字符串也被视为有效字符串。
示例 1:
输入: "()"
输出: True
示例 2:
输入: "(*)"
输出: True
示例 3:
输入: "(*))"
输出: True
注意:
- 字符串大小将在 [1,100] 范围内。
思路
1 class Solution { 2 public boolean checkValidString(String s) { 3 int n = s.length(); 4 if (n == 0) return true; 5 boolean[][] dp = new boolean[n][n]; 6 7 for (int i = 0; i < n; i++) { 8 if (s.charAt(i) == '*') dp[i][i] = true; 9 if (i < n-1 && 10 (s.charAt(i) == '(' || s.charAt(i) == '*') && 11 (s.charAt(i+1) == ')' || s.charAt(i+1) == '*')) { 12 dp[i][i+1] = true; 13 } 14 } 15 16 for (int size = 2; size < n; size++) { 17 for (int i = 0; i + size < n; i++) { 18 if (s.charAt(i) == '*' && dp[i+1][i+size] == true) { 19 dp[i][i+size] = true; 20 } else if (s.charAt(i) == '(' || s.charAt(i) == '*') { 21 for (int k = i+1; k <= i+size; k++) { 22 if ((s.charAt(k) == ')' || s.charAt(k) == '*') && 23 (k == i+1 || dp[i+1][k-1]) && 24 (k == i+size || dp[k+1][i+size])) { 25 dp[i][i+size] = true; 26 } 27 } 28 } 29 } 30 } 31 return dp[0][n-1]; 32 } 33 }