题目
给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。
链接:https://leetcode.com/problems/letter-case-permutation/
Given a string S, we can transform every letter individually to be lowercase or uppercase to create another string. Return a list of all possible strings we could create.
Example:
Input: S = “a1b2”
Output: [“a1b2”, “a1B2”, “A1b2”, “A1B2”]
思路及代码
1. 位运算初尝试
- str.isalpha(): 判断字符串是否只由字母组成
# 160ms 6.11%
class Solution:
def letterCasePermutation(self, S: str) -> List[str]:
cur = []
ans = []
def convert(letter):
if letter.upper() == letter:
return letter.lower()
else:
return letter.upper()
for bit in range(1<<len(S)):
for i in range(len(S)):
if not S[i].isalpha(): # number
if not bit & 1<<i:
break
cur.append(S[i])
else:
if bit & 1<<i:
cur.append(convert(S[i]))
else:
cur.append(S[i])
if len(cur) == len(S):
ans.append("".join(cur))
cur = []
return ans
2. 改进
- DFS recursion
- 如果是字母,两个分支;如果是数字,一个分支
# 64ms 35.99%
class Solution:
def letterCasePermutation(self, S: str) -> List[str]:
ans = []
S = list(S)
def convert(letter):
if letter.upper() == letter:
return letter.lower()
else:
return letter.upper()
def dfs(S, i, ans):
if i == len(S):
ans.append("".join(S))
return
dfs(S, i+1, ans)
if S[i].isalpha():
S[i] = convert(S[i])
dfs(S, i+1, ans)
S[i] = convert(S[i])
dfs(S, 0, ans)
return ans
3. 进阶
- ^异或 1<<5,相当于把第5位从0变到1,从1变到0, 即实现大小写的转换
- 0 ^ 0=0 , 0 ^ 1= 1 , 1 ^ 0= 1 , 1 ^ 1= 0
- ord()返回对应的ASCII码
- chr()返回对应的ASCII字符
# 大小写互相转换
S[i] = chr(ord(S[i]) ^ (1<<5))
4. 笛卡尔积
- 来源于Discuss区(/膜)
class Solution:
def letterCasePermutation(self, S: str) -> List[str]:
L = [[l.upper(), l.lower()] if l.isalpha() else l for l in S]
return ["".join(s) for s in itertools.product(*L)]
复杂度
DFS:
T =
O
(
n
∗
2
l
)
O(n*2^l)
O(n∗2l),l为字母的个数
S =
O
(
n
)
O(n)
O(n)