1. 程式人生 > >Leetcode 678.有效的括號字符串

Leetcode 678.有效的括號字符串

clas 括號 span 字符 black bubuko gree 分享圖片 new

有效的括號字符串

給定一個只包含三種字符的字符串:( ,) 和 *,寫一個函數來檢驗這個字符串是否為有效字符串。有效字符串具有如下規則:

  1. 任何左括號 ( 必須有相應的右括號 )。
  2. 任何右括號 ) 必須有相應的左括號 ( 。
  3. 左括號 ( 必須在對應的右括號之前 )。
  4. * 可以被視為單個右括號 ) ,或單個左括號 ( ,或一個空字符串。
  5. 一個空字符串也被視為有效字符串。

示例 1:

輸入: "()"

輸出: True

示例 2:

輸入: "(*)"

輸出: True

示例 3:

輸入: "(*))"

輸出: True

註意:

  1. 字符串大小將在 [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 }

技術分享圖片

Leetcode 678.有效的括號字符串