基于发布订阅模式的Web实时通信框架hermes-for-web实践指南
2026/5/16 19:05:47
给定一个字符串s,通过将字符串中的每个字母改成大写或小写,生成所有可能的字符串。
返回所有可能的字符串组成的列表。数字和特殊字符保持不变。
示例:
输入: s = "a1b2" 输出: ["a1b2", "a1B2", "A1b2", "A1B2"] 输入: s = "3z4" 输出: ["3z4", "3Z4"] 输入: s = "12345" 输出: ["12345"]核心:
方法:
importjava.util.*;classSolution{/** * 使用回溯生成字母大小写全排列 * * @param s 输入字符串 * @return 所有可能的字符串列表 */publicList<String>letterCasePermutation(Strings){List<String>result=newArrayList<>();// 将字符串转换为字符数组char[]chars=s.toCharArray();// 从索引0开始回溯backtrack(chars,0,result);returnresult;}/** * 回溯函数:递归生成所有可能的排列 * * @param chars 当前字符数组 * @param index 当前处理的字符索引 * @param result 结果列表 */privatevoidbacktrack(char[]chars,intindex,List<String>result){// 递归终止条件:处理完所有字符if(index==chars.length){result.add(newString(chars));return;}charcurrent=chars[index];if(Character.isLetter(current)){// 1:保持小写(或原样)chars[index]=Character.toLowerCase(current);backtrack(chars,index+1,result);// 2:转换为大写chars[index]=Character.toUpperCase(current);backtrack(chars,index+1,result);}else{// 非字母字符,直接跳过backtrack(chars,index+1,result);}}}importjava.util.*;classSolution{/** * 使用迭代生成字母大小写全排列 * * @param s 输入字符串 * @return 所有可能的字符串列表 */publicList<String>letterCasePermutation(Strings){List<String>result=newArrayList<>();result.add("");// 初始化为空字符串// 逐个字符处理for(charc:s.toCharArray()){List<String>newResult=newArrayList<>();// 对当前结果中的每个字符串,扩展新的字符for(Stringstr:result){if(Character.isLetter(c)){// 字母:添加小写和大写两种情况newResult.add(str+Character.toLowerCase(c));newResult.add(str+Character.toUpperCase(c));}else{// 非字母:直接添加newResult.add(str+c);}}result=newResult;}returnresult;}}importjava.util.*;classSolution{/** * 使用位运算生成字母大小写全排列 * * @param s 输入字符串 * @return 所有可能的字符串列表 */publicList<String>letterCasePermutation(Strings){// 首先找出所有字母的位置List<Integer>letterIndices=newArrayList<>();char[]chars=s.toCharArray();for(inti=0;i<chars.length;i++){if(Character.isLetter(chars[i])){letterIndices.add(i);}}intletterCount=letterIndices.size();List<String>result=newArrayList<>();// 枚举所有可能的位组合 (0 到 2^letterCount - 1)for(intmask=0;mask<(1<<letterCount);mask++){char[]current=Arrays.copyOf(chars,chars.length);// 根据mask的每一位决定对应字母的大小写for(inti=0;i<letterCount;i++){if((mask&(1<<i))!=0){// 第i位为1:大写current[letterIndices.get(i)]=Character.toUpperCase(current[letterIndices.get(i)]);}else{// 第i位为0:小写current[letterIndices.get(i)]=Character.toLowerCase(current[letterIndices.get(i)]);}}result.add(newString(current));}returnresult;}}时间复杂度:O(2^n × m)
空间复杂度:
回溯:
开始: index=0, chars=['a','1','b','2'] ├─ index=0, 'a'是字母 │ ├─ 小写: chars=['a','1','b','2'], index=1 │ │ ├─ index=1, '1'不是字母 → index=2 │ │ │ ├─ index=2, 'b'是字母 │ │ │ │ ├─ 小写: chars=['a','1','b','2'], index=3 │ │ │ │ │ └─ index=3, '2'不是字母 → index=4 → 添加"a1b2" │ │ │ │ └─ 大写: chars=['a','1','B','2'], index=3 │ │ │ │ └─ index=3, '2'不是字母 → index=4 → 添加"a1B2" │ │ └─ 大写: chars=['A','1','b','2'], index=1 │ ├─ index=1, '1'不是字母 → index=2 │ │ ├─ index=2, 'b'是字母 │ │ │ ├─ 小写: chars=['A','1','b','2'], index=3 → 添加"A1b2" │ │ │ └─ 大写: chars=['A','1','B','2'], index=3 → 添加"A1B2"最终结果:[“a1b2”, “a1B2”, “A1b2”, “A1B2”]
publicstaticvoidmain(String[]args){Solutionsolution=newSolution();// 测试用例1:标准示例System.out.println("Test 1: "+solution.letterCasePermutation("a1b2"));// ["a1b2", "a1B2", "A1b2", "A1B2"]// 测试用例2:包含数字System.out.println("Test 2: "+solution.letterCasePermutation("3z4"));// ["3z4", "3Z4"]// 测试用例3:纯数字System.out.println("Test 3: "+solution.letterCasePermutation("12345"));// ["12345"]// 测试用例4:单个字母System.out.println("Test 4: "+solution.letterCasePermutation("a"));// ["a", "A"]// 测试用例5:空字符串System.out.println("Test 5: "+solution.letterCasePermutation(""));// [""]// 测试用例6:多个连续字母System.out.println("Test 6: "+solution.letterCasePermutation("ab"));// ["ab", "aB", "Ab", "AB"]// 测试用例7:包含大写字母的输入System.out.println("Test 7: "+solution.letterCasePermutation("A1B2"));// ["a1b2", "a1B2", "A1b2", "A1B2"]// 测试用例8:混合大小写和特殊字符System.out.println("Test 8: "+solution.letterCasePermutation("C1@d"));// ["c1@d", "c1@D", "C1@d", "C1@D"]// 测试用例9:较长字符串System.out.println("Test 9: "+solution.letterCasePermutation("a1b2c3"));// 8种组合// 测试用例10:只有特殊字符System.out.println("Test 10: "+solution.letterCasePermutation("!@#$%"));// ["!@#$%"]}字符:
Character.isLetter()准确判断字母大小写转换:
Character.toLowerCase()和Character.toUpperCase()回溯:
边界情况: