有效的括号字符串(力扣)动态规划、贪心 JAVA

这篇具有很好参考价值的文章主要介绍了有效的括号字符串(力扣)动态规划、贪心 JAVA。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

给你一个只包含三种字符的字符串,支持的字符类型分别是 ‘(’、‘)’ 和 ‘*’。请你检验这个字符串是否为有效字符串,如果是有效字符串返回true 。

有效字符串符合如下规则:

任何左括号 ‘(’ 必须有相应的右括号 ‘)’。 任何右括号 ‘)’ 必须有相应的左括号 ‘(’ 。 左括号 ‘(’ 必须在对应的右括号之前 ‘)’。 ‘*’ 可以被视为单个右括号 ‘)’ ,或单个左括号 ‘(’ ,或一个空字符串。 一个空字符串也被视为有效字符串。

示例 1:

输入:s = “()”
输出:true

示例 2:

输入:s = “(*)”
输出:true

示例 3:

输入:s = “(*))”
输出:true

提示:

1 <= s.length <= 100
s[i] 为 ‘(’、‘)’ 或 ‘*’

解题思路:

1、最开始我的想法是利用单括号思维解决本题‘(’无非多了一个‘*’,谁缺给谁补,事实证明我的想法还是很有漏洞

错误代码:

class Solution {
	public int balance = 0, middle = 0;
    public boolean checkValidString(String s) {
         
        for(char a : s.toCharArray()) {
           if(a == '(') {
        	   if(check()) return false;
			       balance ++;
           }
           else if(a == ')') {
        	   balance --;
        	   if(check()) return false;
           }
           else if(a == '*') middle ++;
        }
				
        return balance == 0;
    }
  
    public boolean check() {
    	while(balance < 0 && middle > 0) {
    		balance ++;
    		middle --;
    	}
    	return balance < 0;
    }
}

有效的括号字符串(力扣)动态规划、贪心 JAVA,leetcode,动态规划,java

上述代码有巨大漏洞即无法判别**((**))的对错,也就是说我没有考虑到*符号的位置的重要性

解决策略:记录下标和栈的引入

2、动态规划去一步一步分析,是可行的,因为其考虑到了‘*’在不同情况产生的不同结果

有效的括号字符串(力扣)动态规划、贪心 JAVA,leetcode,动态规划,java

代码:文章来源地址https://www.toymoban.com/news/detail-633125.html

class Solution {
    public boolean checkValidString(String s) {
        int n = s.length();
        boolean[][] f = new boolean[n + 1][n + 1];
        f[0][0] = true;
        for (int i = 1; i <= n; i++) {
            char c = s.charAt(i - 1);
            for (int j = 0; j <= i; j++) {
                if (c == '(') {
                    if (j - 1 >= 0) f[i][j] = f[i - 1][j - 1];
                } else if (c == ')') {
                    if (j + 1 <= i) f[i][j] = f[i - 1][j + 1];
                } else {
                    f[i][j] = f[i - 1][j];
                    if (j - 1 >= 0) f[i][j] |= f[i - 1][j - 1];
                    if (j + 1 <= i) f[i][j] |= f[i - 1][j + 1];
                }
            }
        }
        return f[n][0];
    }
}

3、下述模拟也可以避免符号位置考虑不到的错误

有效的括号字符串(力扣)动态规划、贪心 JAVA,leetcode,动态规划,java

代码:

class Solution {
    public boolean checkValidString(String s) {
        // l: 左括号最少可能有多少个
        // r: 左括号最多可能有多少个
        int l = 0, r = 0;
        for (char c : s.toCharArray()) {
            // 遇到'('所有可能性加一
            // 遇到')'所有可能性减一
            // 遇到'*',最少的可能性可以变少,最多的可能性也同样可以变多,这取决于这个星号最终我们看成什么,但是可能性都在
            if (c == '(') {
                l++; r++;
            } else if (c == ')') {
                l--; r--;
            } else {
                l--; r++;
            }
            // 当前左括号最少个数不能为负
            l = Math.max(l, 0);
            // 这种情况其实发生在r本身是负数的时候,也就是我们常见的右括号太多了
            if (l > r) return false;
        }
        // 能取到0个左括号才是满足平衡的
        return l == 0;
    }
}

到了这里,关于有效的括号字符串(力扣)动态规划、贪心 JAVA的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包