括号匹配问题&&整理字符串

 1.括号匹配问题

思路:

  • 如果当前元素为左括号,则入栈
  • 栈顶元素和当前元素匹配,则栈顶元素出栈
  • 遇到左括号就入栈,最终,如果栈里面元素为空,则说明匹配,否则左括号或者右括号过多
package com.bite.everydaytaozhu;

import java.util.Stack;

public class kuohaopipei {
    public static boolean isValid(String str){
        Stack<Character> stack = new Stack<>();
        for(int i = 0; i <str.length(); i++){
              if(str.charAt(i) == '(' || str.charAt(i) == '{' || str.charAt(i) == '['  ){
                  stack.push(str.charAt(i));
              }else{
                  if(stack.isEmpty()){
                      return false;
                  }else{
                      if(str.charAt(i) == ')' && stack.peek() == '('
                              || str.charAt(i) == '}' && stack.peek() == '{'
                              || str.charAt(i) == ']' && stack.peek() == '['){
                          stack.pop();
                      }else if(str.charAt(i) == '(' || str.charAt(i) == '{' || str.charAt(i) == '['  ){
                          stack.push(str.charAt(i));

                      }else{
                          return false;
                      }
                  }
              }
        }
        if(stack.isEmpty()){
            return true;
        }else{
            return false;
        }
    }
    public static void main(String[] args) {
        String s = "{}}";
        System.out.println(isValid(s));
    }
}

2.整理字符串

//给你一个由大小写英文字母组成的字符串 s 。
//一个整理好的字符串中,两个相邻字符 s[i] 和 s[i+1],其中 0<= i <= s.length-2 ,要满足如下条件:
//若 s[i] 是小写字符,则 s[i+1] 不可以是相同的大写字符。
//若 s[i] 是大写字符,则 s[i+1] 不可以是相同的小写字符。
//请你将字符串整理好,每次你都可以从字符串中选出满足上述条件的 两个相邻 字符并删除,直到字符串整理好为止。
//请返回整理好的 字符串 。题目保证在给出的约束条件下,测试样例对应的答案是唯一的。
//注意:空字符串也属于整理好的字符串,尽管其中没有任何字符。
//示例 1:
//        输入:s = "leEeetcode"
//        输出:"leetcode"
//        解释:无论你第一次选的是 i = 1 还是 i = 2,都会使 "leEeetcode" 缩减为 "leetcode" 。
//        示例 2:
//
//        输入:s = "abBAcC"
//        输出:""
//        解释:存在多种不同情况,但所有的情况都会导致相同的结果。例如:
//        "abBAcC" --> "aAcC" --> "cC" --> ""
//        "abBAcC" --> "abBA" --> "aA" --> ""s

思路:

  • 栈为空,入栈当前元素
  • 栈不为空,判断当前元素和栈顶元素是否为大小写,若为同一字母的大小写,则弹出栈顶元素;否则,入栈当前元素
public class zhenglizifuchuan {
    public static String makeGood(String str){
        StringBuffer stringBuffer = new StringBuffer();
        Stack<Character> stack = new Stack<>();
        for(int i = 0; i < str.length(); i++){
            if(stack.isEmpty()){
                stack.push(str.charAt(i));
            }else{
                if(stack.peek()-str.charAt(i) == 32 || stack.peek()-str.charAt(i)==-32){
                    stack.pop();
                }else{
                    stack.push(str.charAt(i));
                }
            }
        }
        while(!stack.isEmpty()){
            stringBuffer.append(stack.pop());
        }
        return stringBuffer.reverse().toString();
    }
    public static void main(String[] args) {
        String str = "leEeetcode";
        System.out.println(makeGood(str));

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值