开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第18天,点击查看活动详情
刷题的日常-2022年12月10号
一天一题,保持脑子清爽
字母大小写全排列
来自leetcode的 784 题,题意如下:
给定一个字符串 s ,通过将字符串 s 中的每个字母转变大小写,我们可以获得一个新的字符串。
返回 所有可能得到的字符串集合 。以 任意顺序 返回输出。
示例1:
输入: s = "a1b2"
输出: ["a1b2", "a1B2", "A1b2", "A1B2"]
示例2:
输入: s = "3z4"
输出: ["3z4","3Z4"]
理解题意
通过题意,我们可以将信息整理如下:
- 题目给出一个字符串,包含字母和数字字符
- 要求我们返回对字母大小写的全排列
做题思路
根据题意得话其实对于每个英文字符,我们只有两种选择,要么是小写,要么是大写,所以我们可以用回溯做。从前往后扫描字符串,如果出现数字,直接拼接即可,如果是字母,那么就需要进行回溯,进行大小写转换,最后将所有的记过记录返回即可,步骤如下:
- 开辟一个栈用于记录当前扫描到的字符
- 往后扫描字符串
- 每遇到一个字符,判断是否为字母,是字母的话进行大小写回溯
- 将当前字符放进栈中
- 最终长度达到最后就将栈里的数据拼接成字符串
- 返回所有的结果
代码实现
代码实现如下:
public class Solution {
List<String> result = new LinkedList<>();
static LinkedList<Character> stack = new LinkedList<>();
public List<String> letterCasePermutation(String s) {
letterCasePermutation(s, 0);
return result;
}
private void letterCasePermutation(String s, int index) {
if (index == s.length()) {
char[] item = new char[s.length()];
int j = 0;
for (int i = stack.size() - 1; i > -1; i--) {
item[j++] = stack.get(i);
}
result.add(new String(item));
return;
}
char c = s.charAt(index);
stack.push(c);
letterCasePermutation(s, index + 1);
stack.pop();
if (c >= '0' && c <= '9') {
return;
}
stack.push((char) (c <= 'Z' ? c + 32 : c - 32));
letterCasePermutation(s, index + 1);
stack.pop();
}
}