最近看到阿里的机试题有一道括号问题,所以自己找了三题做了一下
ps. 三题最开始用栈做始终不能兼容初始和后续累加,,看了参考答案,初始压栈
-1太绝了
20.有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
class Solution {
public boolean isValid(String s) {
// 奇数直接返回false
if(s.length() % 2 > 0){
return false;
}
int l = s.length() / 2;
for(int i = 0; i < l; i++){
s = s.replace("()","").replace("[]","").replace("{}","");
}
return s.length() == 0;
}
}
678.有效的括号字符串
给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:
任何左括号 ( 必须有相应的右括号 )。 任何右括号 ) 必须有相应的左括号 ( 。 左括号 ( 必须在对应的右括号之前 )。 * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。 一个空字符串也被视为有效字符串。
class Solution {
public boolean checkValidString(String s) {
Stack<Integer> _l = new Stack();
Stack<Integer> _s = new Stack();
char[] chars = s.toCharArray();
for(int i = 0; i< chars.length; i++){
if(chars[i] == '(') _l.push(i);
if(chars[i] == '*') _s.push(i);
if(chars[i] == ')'){
if(!_l.empty()){
_l.pop();
}else if(!_s.empty()){
_s.pop();
}else {
return false;
}
}
}
if(!_l.empty()){
int size = _s.size();
for(int i = 0; i< size; i++){
if(!_l.empty() && _s.peek() >_l.peek()){
_s.pop();
_l.pop();
}
}
}
if(_l.empty()) return true;
return false;
}
}
32.最长的有小括号
给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
class Solution {
public int longestValidParentheses(String s) {
char[] chars = s.toCharArray();
Stack<Integer> _l = new Stack();
int len = 0;
int mLen = 0;
_l.push(-1);
for(int i = 0; i < chars.length; i++){
if(chars[i] == '(') _l.push(i);
if(chars[i] == ')'){
_l.pop();
if(_l.empty()) _l.push(i);
else {
mLen = mLen < i - _l.peek() ? i - _l.peek() : mLen;
}
}
}
return mLen;
}
}
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。