力扣字符串练习题(电话号码的字母组合、有效的括号)

125 阅读3分钟

电话号码的字母组合

来源:力扣(LeetCode) 链接:leetcode.cn/problems/le…

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

图片.png

示例 1:

输入:digits = "23"

输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

示例 2:

输入:digits = ""

输出:[]

示例 3:

输入:digits = "2"

输出:["a","b","c"]

提示:

  • 0 <= digits.length <= 4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

代码

class Solution {
    private String[] mappings = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};
    
    public List<String> letterCombinations(String digits) {
        List<String> combinations = new ArrayList<>();
        
        if (digits == null || digits.length() == 0) {
            return combinations;
        }
        
        backtrack(combinations, new StringBuilder(), digits, 0);
        
        return combinations;
    }
    
    private void backtrack(List<String> combinations, StringBuilder current, String digits, int index) {
        if (index == digits.length()) {
            combinations.add(current.toString());
            return;
        }
        
        char digit = digits.charAt(index);
        String letters = mappings[digit - '0'];
        
        for (char c : letters.toCharArray()) {
            current.append(c);
            backtrack(combinations, current, digits, index + 1);
            current.deleteCharAt(current.length() - 1);
        }
    }
}

思路分析

  1. 创建一个数组mappings,存储电话按键上数字对应的字母集合。
  2. 创建一个空列表combinations,用于存储生成的所有可能的字母组合。
  3. 如果给定的数字字符串digits为null或长度为0,则直接返回空列表combinations
  4. 调用回溯函数backtrack,传入空的StringBuilder对象current、数字字符串digits和初始索引0。
  5. 在回溯函数backtrack中,判断当前索引index是否达到数字字符串的长度。如果是,表示已经生成了一个完整的字母组合,将其加入到列表combinations中并返回。
  6. 获取当前索引index处的数字字符digit,并找到其对应的字母集合letters
  7. 遍历字母集合letters中的每个字母,将其加入到current中,然后递归调用backtrack,将索引index加1。
  8. 递归调用结束后,需要将当前加入的字母从current中删除,以便下一次迭代使用。
  9. 完成回溯后,返回列表combinations作为结果。

有效的括号

来源:力扣(LeetCode) 链接:leetcode.cn/problems/va…

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

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 每个右括号都有一个对应的相同类型的左括号。

示例 1:

输入:s = "()"

输出:true

示例 2:

输入:s = "()[]{}"

输出:true

示例 3:

输入:s = "(]"

输出:false

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

代码

class Solution {
    public boolean isValid(String s) {
        Stack<Character> stack = new Stack<>();
        
        for (char c : s.toCharArray()) {
            if (c == '(' || c == '[' || c == '{') {
                stack.push(c);
            } else {
                if (stack.isEmpty()) {
                    return false;
                }
                
                char top = stack.pop();
                
                if ((c == ')' && top != '(') || (c == ']' && top != '[') || (c == '}' && top != '{')) {
                    return false;
                }
            }
        }
        
        return stack.isEmpty();
    }
}

思路分析

  1. 创建一个栈stack,用于存储左括号。
  2. 遍历字符串s中的每个字符。
  3. 如果当前字符是左括号(即'('、'['、'{'),将其压入栈stack中。
  4. 如果当前字符是右括号(即')'、']'、'}'),判断栈是否为空。如果栈为空,说明没有对应的左括号与之匹配,返回false
  5. 如果栈不为空,弹出栈顶元素,与当前右括号进行匹配。如果匹配失败,返回false
  6. 完成遍历后,检查栈是否为空。如果栈为空,表示所有左括号都有对应的右括号与之匹配,返回true;否则,返回false