题目要求:
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
代码实现:
class Solution {
static char[] left = new char[]{'(','{','['};
static char[] right = new char[]{')','}',']'};
public static boolean isValid(String s) {
if(s == null) return true;
if(s.length()%2 != 0) return false;
LinkedList<Character> list = new LinkedList<>();
for(char c :s.toCharArray()) {
if(isLeft(c)) {
list.add(c);
} else if(isRight(c)) {
if(list.size() < 1) return false;
if(isRightTrue(list.get(list.size()-1), c)) list.remove(list.size()-1);
else return false;
} else {
return false;
}
}
if(list.size() == 0) return true;
return false;
}
/**
* 判断字符是否是一个左括号
*/
private static boolean isLeft(char leftc) {
for (int i = 0; i < left.length; i++) {
if(left[i] == leftc) return true;
}
return false;
}
/**
* 判断字符是否是一个右括号
*/
private static boolean isRight(char rightc) {
for (int i = 0; i < right.length; i++) {
if(right[i] == rightc) return true;
}
return false;
}
/**
* 判断2个字符是否是一个完整的括号
*/
public static boolean isRightTrue(char leftc, char rightc) {
char[] left = new char[]{'(','{','[',};
char[] right = new char[]{')','}',']'};
for (int i = 0; i < left.length; i++) {
if(left[i] == leftc && right[i] == rightc) return true;
}
return false;
}
}
解题思路:
1.先做一个初略的判断,如果字符串为有效的括号,则字符串的长度一定是偶数或者0,例如:“” || “[]” || “{[()]}”;
所以:if(s.length()%2 != 0) return false;
2.分析有效括号的结构
1>一个有效括号的构成必然由一个左括号和一个右括号构成,所以我把数据分成leftChar和rightChar;
2>最后添加的leftChar必然被最先消费,及最后添加的leftChar必然背下一个rightChar所消费;
例如: {[]},{[][]},[()({})]
这一期的算法就到这里了,感谢您的阅读,如果您有更加效率的解决办法或者不一样的思路都可以给我留言,我们一同成长!