给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()" 输出: true
示例 2:
输入: "()[]{}" 输出: true
示例 3:
输入: "(]" 输出: false
示例 4:
输入: "([)]" 输出: false
示例 5:
输入: "{[]}"
输出: true
思路
:创造一个空字符串stack,用于存(、[、{等,预见)、]、}对比字符串尾位是否是对应的左端值,是的话,利用substring删除尾位,如果最后stack为空,则说明结果正确。
遇到的问题
:奇数一定是错的,一开始感觉写的可以直接覆盖掉,但是没有 哭唧唧。
解决方案
:处理前直接判断。
出现先后端值,在左端值的情况,length=0时减1出现错误。
解决方案
:遇见右端值,优先判断length是否为0,为零直接返回false。
class Solution {
public boolean isValid(String s) {
//返回的字符串,左端数据会存入,右端数据会删除,最后为空,则结果为true
String stack = "";
//奇数必定错误
if(s.length()%2 == 1)
return false;
//处理过程
for(int i = 0;i < s.length();i++)
{ //如果是后端数据,且长度为0了,就说明错误
if(s.charAt(i) == ')'||s.charAt(i) == ']'||s.charAt(i) == '}')
if(stack.length()==0)
{
return false;
}
//左端数据存入
if(s.charAt(i) == '('||s.charAt(i) == '['||s.charAt(i) == '{')
stack+=s.charAt(i);
//根据右端数据判断字符串尾端对应左端数据
else if(s.charAt(i) == ')'&&stack.charAt(stack.length()-1) == '(')
//对应时,删除尾端元素
stack = stack.substring(0, stack.length()-1);
else if(s.charAt(i) == ']'&&stack.charAt(stack.length()-1) == '[')
stack = stack.substring(0, stack.length()-1);
else if(s.charAt(i) == '}'&&stack.charAt(stack.length()-1) == '{')
stack = stack.substring(0, stack.length()-1);
}
//为空则正确,不为空为错误
return stack.equals("");
}
}