题目
https://leetcode.com/problems/valid-parenthesis-string/description/
题意
Given a string containing only three types of characters: ‘(‘, ‘)’ and ‘*’, write a function to check whether this string is valid. We define the validity of a string by these rules:
Any left parenthesis ‘(‘ must have a corresponding right parenthesis ‘)’.
Any right parenthesis ‘)’ must have a corresponding left parenthesis ‘(‘.
Left parenthesis ‘(‘ must go before the corresponding right parenthesis ‘)’.
‘*’ could be treated as a single right parenthesis ‘)’ or a single left parenthesis ‘(‘ or an empty string.
An empty string is also valid.
判断系列是否是合法的括号序列,其中’*’可以替代’)’或者‘(’或者空。
题解
- 暴力求解
对每个’‘都替换为三种情况递归判断,但是会超时。时间复杂度O(N3^N)。
1 |
|
- DP
设dp[i][j] 为true,当且仅当s[i], s[i+1], …, s[j]是合适的。
状态转换方程为:如果存在i+1<=k<=j使得s[i][k]为true且s[k+1][j]为true。
1 | class Solution { |
时间复杂度O(N^3),空间复杂度O(N^2)。
- 贪心
依次扫描,维护两个值,cmin代表,最少的可能不匹配的左括号,cmax代表最多的可能不匹配的左括号数量。
显然,如果当前字符为‘(’,cmin,cmax都加1;
如果当前字符为‘)’,cmin,cmax都减1,但是cmin至少应该为0;如果cmax小于0,标识右括号数量大于左括号,不匹配。
如果当前字符为‘*’,如果替换为‘(’,cmax加1,如果替换为’)’,cmin减1,同样至少为0。
最后判断cmin是否为0.
1 | class Solution { |
时间复杂度O(N),空间复杂度O(1).