Leetcode 678.有效的括号字符串
Posted kexinxin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }
以上是关于Leetcode 678.有效的括号字符串的主要内容,如果未能解决你的问题,请参考以下文章
Leetcode刷题100天—678. 有效的括号字符串( 字符串)—day36
Leetcode刷题100天—678. 有效的括号字符串( 字符串)—day36
LeetCode 678. 有效的括号字符串(贪心,动规) / 4. 寻找两个正序数组的中位数(二分,关键题) / 447. 回旋镖的数量