括号问题

括号问题用栈一般都能解决

20. 有效的括号

题目描述:

括号问题 - 图1

括号问题 - 图2

思路:用栈

代码:

  1. import java.util.Stack;
  2. class Solution {
  3. public boolean isValid(String s) {
  4. Stack<Character> stack = new Stack<Character>();
  5. for (Character c : s.toCharArray()) {
  6. if(c=='{'||c=='['||c=='(') {
  7. //入栈
  8. stack.push(c);
  9. }else {
  10. if(!stack.isEmpty()&&charJT(c)==stack.peek()){
  11. stack.pop();
  12. }else {
  13. return false;
  14. }
  15. }
  16. }
  17. return stack.isEmpty();
  18. }
  19. private Character charJT(Character c) {
  20. if(c=='}') return '{';
  21. else if(c==')') return '(';
  22. else return '[';
  23. }
  24. }

921. 使括号有效的最少添加

题目描述:

括号问题 - 图3

括号问题 - 图4

和上题一样的思路,用栈,于是乎:

  1. package 使括号有效的最小添加;
  2. import java.util.Stack;
  3. class Solution {
  4. public int minAddToMakeValid(String s) {
  5. int count=0;
  6. Stack<Character> stack = new Stack<Character>();
  7. for (Character c : s.toCharArray()) {
  8. if(c=='(') {
  9. //入栈
  10. stack.push(c);
  11. }else {
  12. if(!stack.isEmpty()){
  13. stack.pop();
  14. }else {
  15. count++;;
  16. }
  17. }
  18. }
  19. return stack.size()+count;
  20. }
  21. }

法二:

  1. class Solution {
  2. public int minAddToMakeValid(String s) {
  3. // res 记录插入次数
  4. int res = 0;
  5. // need 变量记录右括号的需求量
  6. int need = 0;
  7. for (int i = 0; i < s.length(); i++) {
  8. if (s.charAt(i) == '(') {
  9. // 对右括号的需求 + 1
  10. need++;
  11. }
  12. if (s.charAt(i) == ')') {
  13. // 对右括号的需求 - 1
  14. need--;
  15. if (need == -1) {
  16. need = 0;
  17. // 需插入一个左括号
  18. res++;
  19. }
  20. }
  21. }
  22. return res + need;
  23. }
  24. }

1541. 平衡括号字符串的最少插入次数(没写出来)

题目描述:

括号问题 - 图5

括号问题 - 图6

难点:内嵌的两个if不好想

代码:

  1. class Solution {
  2. public int minInsertions(String s) {
  3. // need 记录需右括号的需求量
  4. int res = 0, need = 0;
  5. for (int i = 0; i < s.length(); i++) {
  6. if (s.charAt(i) == '(') {
  7. // 一个左括号对应两个右括号
  8. need += 2;
  9. if (need % 2 == 1) { //没有下面这段的话 这个案例"()))()))"过不了
  10. // 插入一个右括号
  11. res++;
  12. // 对右括号的需求减一
  13. need--;
  14. }
  15. }
  16. if (s.charAt(i) == ')') {
  17. need--;
  18. // 说明右括号太多了
  19. if (need == -1) {
  20. // 需要插入一个左括号
  21. res++;
  22. // 同时,对右括号的需求变为 1
  23. need = 1;
  24. }
  25. }
  26. }
  27. return res + need;
  28. }
  29. }