刷题的日常-字母大小写全排列

83 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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();
    }
}

image.png