括号问题
22. 括号生成
数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。
示例 1:
输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]
示例 2:
输入:n = 1
输出:["()"]
class Solution {
public List<String> generateParenthesis(int n) {
List<String> res = new ArrayList<>();
String tmp = "";
recurse(0, 0 , n, tmp, res);
return res;
}
public void recurse(int left, int right, int n, String tmp, List<String> res){
if(right > left || left > n){
return;
}if(left == n && right == n){
res.add(tmp);
return;
}
recurse(left + 1, right, n, tmp + "(", res);
recurse(left, right + 1, n, tmp + ")", res);
}
}
[2] 力扣-20. 有效的括号
20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
Map<Character, Character> map = new HashMap<>();
map.put('(', ')');
map.put('[', ']');
map.put('{', '}');
for(char ch : s.toCharArray()){
if(map.containsKey(ch)){ // 左括号入栈
stack.add(ch);
}else if(stack.isEmpty() || map.get(stack.pop()) != ch ){ // 右括号判断是否一致,不一致直接返回
return false;
}
}
return stack.isEmpty();
}
}
[3] 力扣394. 字符串解码
394. 字符串解码
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例 1:
输入:s = "3[a]2[bc]"
输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]"
输出:"accaccacc"
class Solution {
public String decodeString(String s) {
// 需要两个stack 存储当前str 以及 multi
LinkedList<Integer> stack_multi = new LinkedList<>();
LinkedList<String> stack_res = new LinkedList<>();
StringBuilder res = new StringBuilder();
int multi = 0;
for(Character c : s.toCharArray()){
// 1. [
if(c == '['){
stack_res.addLast(res.toString());
res = new StringBuilder();
stack_multi.add(multi);
multi = 0;
}
// 2. ]
else if(c == ']'){
// 这里一定不要使用原有的multi 对象,否则会影响后续
int cur_multi = stack_multi.removeLast();
StringBuilder tmp = new StringBuilder();
for(int i = 0; i < cur_multi; i++){
tmp.append(res);
}
res = new StringBuilder(stack_res.removeLast() + tmp.toString());
}
// 3. 数字
else if(c >= '0' && c <= '9'){
multi = multi * 10 + Integer.parseInt(c + "");
}
// 4. 字母
else{
res.append(c);
}
}
return res.toString();
}
}
// 时间复杂度 O(N)O(N),一次遍历 s;
// 空间复杂度 O(N)O(N),辅助栈在极端情况下需要线性空间,例如 2[2[2[a]]]。