最近在leetcode刷简单的面试题,发现,解题思路真的很重要。
我觉得这个是很值得记录的一道题,题目为:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。输入:s = "()[]{}" 输出:true输入:s = "([)]" 输出:false
先来说一下我一开始的思路:(最终没解答处理)
我认为,正确的情况只有2种可能,一种是紧挨着一对一对的,例如:()[]{};另外一种是对称的,例如:({[]})。顺着我的思路,我开始写,代码
public boolean isValid(String s) {
boolean flag=false;
Map<String,String> map = new HashMap();
map.put("(",")");
map.put("{","}");
map.put("[","]");
if(s.length()%2==0){
// 一种是紧挨着 ()[]{}
for (int i=0;i<s.length();i++){
String substring = s.substring(i, i + 2);
if("(".equals(String.valueOf(substring.charAt(0))) &&
")".equals(String.valueOf(substring.charAt(1)))){
flag=true;
}else if ("{".equals(String.valueOf(substring.charAt(0))) &&
"}".equals(String.valueOf(substring.charAt(1)))){
flag=true;
}else if ("[".equals(String.valueOf(substring.charAt(0))) &&
"]".equals(String.valueOf(substring.charAt(1)))){
flag=true;
}
}
// todo 另一种是对称({[]}) 还没想好对称的code方案,又想到不对,还有这种混合的:{[]}()
}else{
return false;
}
return flag;
}
后来,看了别人的解题思路,真的是“傻傻写了几十行代码,还不如一个好的思路。。。”
来看一看,别人家的“思路”,短短几行代码。。
public boolean isValid(String s) {
int length = s.length() / 2;
for (int i = 0; i < length; i++) {
s = s.replace("()", "").replace("{}", "").replace("[]", "");
}
return s.length() == 0;
}
另外一种解题思路,是利用栈
public boolean isValid(String s) {
if(s.length()%2==0){
Stack<Character> stack=new Stack<>();
for(int i=0;i<s.length();i++){
char c=s.charAt(i);
if(c=='('||c=='['||c=='{'){
stack.push(c);
}
else if(c==')'){
if(!stack.isEmpty()&&stack.peek()=='('){stack.pop();}
else{return false;}
}
else if(c=='}'){
if(!stack.isEmpty()&&stack.peek()=='{'){stack.pop();}
else{return false;}
}
else{
if(!stack.isEmpty()&&stack.peek()=='['){stack.pop();}
else{return false;}
}
}
return stack.isEmpty();
}
return false;
}
记录一下吧~