电话号码的字母组合
来源:力扣(LeetCode) 链接:leetcode.cn/problems/le…
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
示例 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);
}
}
}
思路分析
- 创建一个数组
mappings,存储电话按键上数字对应的字母集合。 - 创建一个空列表
combinations,用于存储生成的所有可能的字母组合。 - 如果给定的数字字符串
digits为null或长度为0,则直接返回空列表combinations。 - 调用回溯函数
backtrack,传入空的StringBuilder对象current、数字字符串digits和初始索引0。 - 在回溯函数
backtrack中,判断当前索引index是否达到数字字符串的长度。如果是,表示已经生成了一个完整的字母组合,将其加入到列表combinations中并返回。 - 获取当前索引
index处的数字字符digit,并找到其对应的字母集合letters。 - 遍历字母集合
letters中的每个字母,将其加入到current中,然后递归调用backtrack,将索引index加1。 - 递归调用结束后,需要将当前加入的字母从
current中删除,以便下一次迭代使用。 - 完成回溯后,返回列表
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();
}
}
思路分析
- 创建一个栈
stack,用于存储左括号。 - 遍历字符串
s中的每个字符。 - 如果当前字符是左括号(即'('、'['、'{'),将其压入栈
stack中。 - 如果当前字符是右括号(即')'、']'、'}'),判断栈是否为空。如果栈为空,说明没有对应的左括号与之匹配,返回
false。 - 如果栈不为空,弹出栈顶元素,与当前右括号进行匹配。如果匹配失败,返回
false。 - 完成遍历后,检查栈是否为空。如果栈为空,表示所有左括号都有对应的右括号与之匹配,返回
true;否则,返回false。