題目
給定一個字符串 S,通過將字符串 S 中的每個字母轉變大小寫,我們可以獲得一個新的字符串然痊。返回所有可能得到的字符串集合革骨。
示例:
示例: 輸入: S = "a1b2" 輸出: ["a1b2", "a1B2", "A1b2", "A1B2"]
輸入: S = "3z4" 輸出: ["3z4", "3Z4"]
輸入: S = "12345" 輸出: ["12345"]
注意: S 的長度不超過12农尖。 S 僅由數(shù)字和字母組成。
思路
這題不需要交換順序排列組合良哲,從0索引開始查找盛卡,如果是當前數(shù)組項為數(shù)字則跳過,為字母則將大寫和小寫兩種組合添加到res中筑凫,并將index + 1傳入作為下一次循環(huán)的索引的開始滑沧,直到匹配不到字母循環(huán)結束。
/**
* @param {string} S
* @return {string[]}
*/
const letterCasePermutation = S => {
const res = []
// 遞歸方法
const backtrack = (start, s) => {
res.push(s)
// start記錄為字母項的下標巍实,從start開始循環(huán)滓技。
for (let i = start; i < s.length; i++) {
// 找到為字母的項,分別添加其大寫與小寫兩種組合棚潦,數(shù)字則跳過令漂。
if (s[i] >= 'a' && s[i] <= 'z') {
// 添加大寫的組合進行拼接
backtrack(i + 1, s.slice(0, i) + s[i].toUpperCase() + s.slice(i + 1))
} else if (s[i] >= 'A' && s[i] <= 'Z') {
// 添加小寫的組合進行拼接
backtrack(i + 1, s.slice(0, i) + s[i].toLowerCase() + s.slice(i + 1))
}
}
}
// 從0開始找,添加初始值進入res
backtrack(0, S)
return res
}