1 题目描述
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
示例:
输入: S = “a1b2”
输出: [“a1b2”, “a1B2”, “A1b2”, “A1B2”]
输入: S = “3z4”
输出: [“3z4”, “3Z4”]
输入: S = “12345”
输出: [“12345”]
注意:
S 的长度不超过12。
S 仅由数字和字母组成。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/letter-case-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
2 解题思路
- 解决方法:DFS 回溯
看到题目要求组合或者集合,马上想到可以用回溯法:回溯法本来是说对于每个元素都先考虑放它的情况,再考虑不放它的情况;放在这道题的背景里就是,对于每个字母,先考虑放它,再考虑放它的另一种大小写形式。
用dfs实现回溯,start代表目前从扫描到第几位,
如果是digit,就直接加进去,然后下一层递归
如果是alpha,就先加进去,然后下一层递归;再加对立大小写形式, 然后下一层递归。
3 解决代码
class Solution(object):
def letterCasePermutation(self, S):
"""
:type S: str
:rtype: List[str]
"""
def dfs(start, temp):
if start >= l or len(temp) == l:
res.append(temp)
return
if S[start].isdigit(): #数字就直接加
dfs(start + 1, temp + S[start])
elif S[start].islower(): #字母就加本身和对立面
dfs(start + 1, temp + S[start])
dfs(start + 1, temp + S[start].upper())
elif S[start].isupper():
dfs(start + 1, temp + S[start])
dfs(start + 1, temp + S[start].lower())
res = list()
l = len(S)
if l == 0:
return [""]
dfs(0, "")
return res