leetcode刷题笔记(简单篇):14&20

文章目录

  • No14.最长公共前缀
    • 1.题目
    • 2.解法
    • 3.解题收获
  • No.20有效的括号
    • 1.题目
    • 2.解法
    • 3.解题收获

No14.最长公共前缀

1.题目

编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 “”。

示例 1:
输入: ["flower","flow","flight"]
输出: "fl"

示例 2:
输入: ["dog","racecar","car"]
输出: ""
解释: 输入不存在公共前缀。

说明:
所有输入只包含小写字母 a-z 。

2.解法

(1)算法思路
字符串数组中有许多元素,可以选择第一个元素A作为参考元素,然后用A分别对剩下的元素进行比较,看是否有公共前缀,若没有,则字符串A删除其末尾字符,继续循环。

(2)算法代码

class Solution {
    public String longestCommonPrefix(String[] strs) {
        if(strs.length == 0){								//当给的字符串数组为空时,显然公共前缀为空
            return "";
        }
        String str = strs[0];								//把字符串数组中的第一个元素str当作参考元素
        for(int i=1;i

3.解题收获

  1. String类的方法indexOf
    在这里插入图片描述
    2.String类的方法sybstring。注意该方法包含开始索引,但不包括结束索引
    在这里插入图片描述

No.20有效的括号

1.题目

给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

示例 1:
输入: "()"
输出: true

示例 2:
输入: "()[]{}"
输出: true

示例 3:
输入: "(]"
输出: false

示例 4:
输入: "([)]"
输出: false

示例 5:
输入: "{[]}"
输出: true

2.解法

(1)解法一:利用栈,字符比较

  • 算法思路
    利用栈。当栈为空的时候,遇到右边的括号’)’,’}’,’]’,说明括号不匹配,直接返回false。当遇到右边的括号’)’,’}’,’]’,判断栈顶是否为对应左边的括号’(,’{’,’[’。如果是的话,栈顶元素退栈。如果不是的话,说明括号不匹配,直接返回false。当遇到左边的括号’(,’{’,’[’,进栈。最后,当栈为空,说明所有的括号都匹配了。直接返回st.empty()。

  • 算法代码

class Solution {
    public boolean isValid(String s) {
        HashMap hm = new HashMap<>(); //创建一个hashmap,相当于一个字典
        hm.put(')', '(');
        hm.put('}', '{');
        hm.put(']', '[');
        Stack stack = new Stack(); //创建一个堆
        for (int i = 0; i < s.length(); i++) {      //遍历字符串s中的每一个字符
            char c = s.charAt(i);           //取字符串s的第i个字符
            if (hm.containsKey(c)) {     //如果当前字符是右括号
                char topElement = stack.empty() ? '#' : stack.pop();    //获取堆栈的顶部元素(同时在栈中删除该元素)。如果堆栈是空的,设置一个哑值'#'
                if (topElement != hm.get(c)) {       //若这个元素不能和栈顶元素匹配
                    return false;
                }
            } else {
                stack.push(c);      //如果它是一个左括号,推到堆栈
            }
        }
        return stack.isEmpty();     //到这一步,若栈不为空,则说明栈中的元素无匹配值,故为false。若栈为空,则说明栈中元素全部匹配完毕
    }
}

(2)解法二:利用栈,同时利用括号也是ASCII,这样从字符比较,变成了数值比较

  • 算法思路
    思路与解法1相同,只是判断左右括号是否匹配,从ASCII码表中,知道右边的括号减去左边的括号为1或者2的时候,说明括号匹配了。
字符 ASCII值
40
41
[ 91
] 93
{ 123
} 125
  • 算法代码
class Solution {
    public boolean isValid(String s) {
        char[] ch = s.toCharArray();
        Stack sta = new Stack<>();
        for (int i = 0; i < s.length(); i++) {
            if (sta.empty() && (ch[i] == ')' || ch[i] == ']' || ch[i] == '}')) {
                return false;
            }
            if (ch[i] == ')' ||ch[i] == ']' || ch[i] == '}') {
                if (ch[i] - sta.peek() == 1 || ch[i] - sta.peek() == 2) {
                    sta.pop();
                } else {
                    return false;
                }
            } else {
                sta.push(ch[i]);
            }
        }
        return sta.empty();
    }
}

3.解题收获

  1. String类的方法toCharArray()
    在这里插入图片描述

  2. 在解法2中,重新创建一个字符串数组,然后读取ch[ ],而不直接用s.charAt()的原因是,charAt函数的源码是创建数组,所以会创建很多数组浪费资源。(charAt源码如下,value是一个数组每次调用都要创建)
    leetcode刷题笔记(简单篇):14&20_第1张图片

  3. 栈(是一个类)的相关知识
    leetcode刷题笔记(简单篇):14&20_第2张图片

你可能感兴趣的:(#,leetcode刷题)