package com.nuo.Y_21M_12;
/**
* @author nuo
* @version 1.0
* @description: TODO leetcode 678
* @date 2021/12/28 13:42
*/
/*
* 给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
*
* 任何左括号 '(' 必须有相应的右括号 ')'。
* 任何右括号 ')' 必须有相应的左括号 '(' 。
* 左括号 '(' 必须在对应的右括号之前 ')'。
* '*' 可以被视为单个右括号 ')' ,或单个左括号 '(' ,或一个空字符串。
* 一个空字符串也被视为有效字符串。
*
* 示例 1:
*
* 输入: "()"
* 输出: True
*
* 示例 2:
*
* 输入: "(*)"
* 输出: True
*
* 示例 3:
*
* 输入: "(*))"
* 输出: True
*
* 注意:
* 字符串大小将在 [1,100] 范围内。
*
*/
public class day10 {
public static void main(String[] args) {
System.out.println(Solution10.checkValidString("(*))"));
}
}
class Solution10 {
public static boolean checkValidString(String s) {
int left = 0;
int right = 0;
char[] c = s.toCharArray();
for (int i = 0; i < c.length; i++) {
left = c[i] == ')'? left - 1 : left + 1;
right = c[c.length - i - 1] == '(' ? right - 1 : right + 1;
if (left < 0|| right < 0){
return false;
}
}
return true;
}
}
有去参考别人的题解 ,利用了贪心算法,大致思路是从左往右和从右往左分别进行判断,从左往右时,因为 '*'可以充当 '(' & ')' ,为了确保'('数量足够 ,把'*'视为'(',每进行一次for循环,判断')'是否有足够的'('去匹配,若没有,则返回 false,否则循环继续,从右往左同理。从左往右和从右往左分别进行判断去确保'(' 和 ')'可以完全配对
PS :该好好去学下贪心算法了......