字母大小写全排列
难度:
标签:
题目描述
代码结果
运行时间: 22 ms, 内存: 17.3 MB
/*
题目思路:
1. 使用流操作将所有可能的字符组合生成。
2. 对于每个字符,如果是字母,则生成大小写两种组合,否则保持原样。
3. 使用流的flatMap和collect方法来汇总所有结果。
*/
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class SolutionStream {
public List<String> letterCasePermutation(String s) {
return letterCasePermutationHelper(s).collect(Collectors.toList());
}
private Stream<String> letterCasePermutationHelper(String s) {
if (s.isEmpty()) {
return Stream.of("");
}
char firstChar = s.charAt(0);
String rest = s.substring(1);
Stream<String> restStream = letterCasePermutationHelper(rest);
if (Character.isLetter(firstChar)) {
return Stream.concat(
restStream.map(str -> firstChar + str),
restStream.map(str -> Character.toLowerCase(firstChar) + str)
);
} else {
return restStream.map(str -> firstChar + str);
}
}
}
解释
方法:
此题解采用了回溯算法。主要思路是遍历给定字符串s的每个字符,如果字符是字母,则有两个选择:小写形式和大写形式。对于每个字母,都递归地探索这两种可能性。如果字符是数字,则无需改变,直接添加到当前字符串,并继续处理下一个字符。当递归到字符串末尾时,将当前构建的字符串添加到结果列表中。这种方法系统地探索了所有可能的字母大小写组合,从而生成所有可能的字符串。
时间复杂度:
O(2^n)
空间复杂度:
O(2^n * n)
代码细节讲解
🦆
回溯算法在处理字母大小写全排列时的基本逻辑是什么?
▷🦆
在递归函数中,为何在处理完一个字符后,需要立即递归处理下一个字符的索引?
▷🦆
当字符为数字时,直接继承到当前字符串中,这种处理方式是否可能漏掉其他潜在的字符串组合?
▷🦆
你是如何保证在递归结束时,所有的字符串都已经完整地添加到结果列表中的?
▷