leetcode: 判断字符串是否有效

题目:

给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。

左括号必须以正确的顺序闭合。

注意空字符串可被认为是有效字符串。

解法1:

思路: 使用hashmap进行存括号的匹配关系,再使用栈来存储左括号;每次进行比较然后弹栈;

步骤:

  1. 将括号匹配关系放入hashmap中
  2. 遍历数组,如果该字符串在map中没有,则表明该字符串是左括号或者其他字符串,放入栈中
  3. 如果该字符串map中有,则表示遍历的是右括号,则要去弹出栈中的元素,看是否匹配,如果不匹配,则表示字符串无效,返回false

步骤

/**
 * 描述: 判断字符串是否有效
 *
 * @author pengjie_yao
 * @date 2019/7/17 16:54
 */
public class ValidString {


    public static void main(String[] args) {
//        Boolean validString = isValidString("{}[]{]}");
//        System.out.println(validString);
        Boolean validString = isValidString1("{}[]{}");
        System.out.println(validString);

    }

    /**
 *  法一 使用堆栈
 * @param string
 * @return
 */
public static Boolean isValidString(String string){
    HashMap<Character,Character> hashMap = new HashMap<>();
    Stack stack = new Stack();
    hashMap.put(')', '(');
    hashMap.put(']', '[');
    hashMap.put('}', '{');
    for (int i = 0; i < string.length(); i++) {
        Character result = string.charAt(i);
        if (! hashMap.containsKey(result)) {
            stack.push(result);
        } else if (stack.isEmpty() || hashMap.get(result) != stack.pop()) {
            return false;
        }
    }
    // 栈为空才返回
    return stack.isEmpty();
}


   

}

解法2

思路: 直接替换,即用字符串的直接替换,只要发现字符串中有该匹配的字符串,则替换掉;

 /**
     *  直接替换法,则只要发现有匹配,直接将字符串中对应的括号直接替换掉,最终根据字符串的长度返回结果
     * @param string
     * @return
     */
    public static Boolean isValidString1(String string) {
        int length;
        do {

            length = string.length();
            string = string.replace("()", "").replace("[]", "").replace("{}", "");
        } while (length != string.length());
        return string.length() == 0;
    }

leetcode中写的比较好的代码学习

思路:同样也是使用栈,用数组作为栈,然后index作为栈顶元素

遍历数组,如果都为左括号,则都加入栈中,同时栈顶元素移动

如果遍历的不是左括号,则判断是否是右括号,是的话,先判断栈中是否有左括号存在,没有直接返回false,有的话,在判断是否等于栈中的元素,因为括号全部就3个,所以只要判断是否等于这三个括号即可,有则返回true,没有则返回false

public boolean isValid(String s) {        
        int index = -1;
        char[] arr = s.toCharArray();
        char[] stack = new char[arr.length];
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == '(' || arr[i] == '[' || arr[i] == '{') {
                index++;
                stack[index] = arr[i];
            }
            if (arr[i] == ')' || arr[i] == '}' || arr[i] == ']') {
               if (index < 0) {
                   return false;
               }
               else if ((stack[index] == arr[i] - 1) || (stack[index] == arr[i] - 2) ) {
                   index--;
               }
               else {
                   return false;
               }
            }
        }
        if (index < 0) {
            return true;  
        }
        else {
            return false;
        }
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值