func permute(nums []int) [][]int {
var res [][]int
var item []int
m := make(map[int]struct{})
n := len(nums)
var dfs func([]int, map[int]struct{})
dfs = func(item []int, m map[int]struct{}) {
if len(item) == n {
a := make([]int, n)
copy(a, item)
res = append(res, a)
return
}
for i := 0; i < n; i++ {
if _, ok := m[nums[i]]; ok {
continue
}
item = append(item, nums[i])
m[nums[i]] = struct{}{}
dfs(item, m)
delete(m, nums[i])
item = item[:len(item)-1]
}
}
dfs(item, m)
return res
}
Approach #1
func permute(nums []int) [][]int {
var res [][]int
n := len(nums)
var backtrack func(int)
backtrack = func(first int) {
if first == n {
a := make([]int, n)
copy(a, nums)
res = append(res, a)
return
}
for i := first; i < n; i++ {
nums[first], nums[i] = nums[i], nums[first]
backtrack(first + 1)
nums[first], nums[i] = nums[i], nums[first]
}
}
backtrack(0)
return res
}
Description
Given a string s, you can transform every letter individually to be lowercase or uppercase to create another string.
Return a list of all possible strings we could create. Return the output in any order.
Example 1:
Input: s = "a1b2"
Output: ["a1b2","a1B2","A1b2","A1B2"]
Example 2:
Input: s = "3z4"
Output: ["3z4","3Z4"]
Constraints:
1 <= s.length <= 12
s consists of lowercase English letters, uppercase English letters, and digits.
Solution
Approach #0: Too Slow
func letterCasePermutation(s string) []string {
sList := []rune(s)
n := len(s)
var res []string
var backtrace func(int)
backtrace = func(start int) {
if start == n {
res = append(res, string(sList))
return
}
for i := start; i < len(sList); i++ {
backtrace(i + 1)
if !unicode.IsLetter(sList[i]) {
continue
}
if unicode.IsLower(sList[i]) {
sList[i] = unicode.ToUpper(sList[i])
backtrace(i + 1)
sList[i] = unicode.ToLower(sList[i])
}
if unicode.IsUpper(sList[i]) {
sList[i] = unicode.ToLower(sList[i])
backtrace(i + 1)
sList[i] = unicode.ToUpper(sList[i])
}
}
}
backtrace(0)
m := make(map[string]struct{})
var a []string
for _, ss := range res {
if _, ok := m[ss]; ok {
continue
}
a = append(a, ss)
m[ss] = struct{}{}
}
return a
}
Approach #1: Much Better
func letterCasePermutation(s string) []string {
res := []string{""}
for _, ch := range s {
n := len(res)
if unicode.IsLetter(rune(ch)) {
for i := 0; i < n; i++ {
res = append(res, res[i]+string(unicode.ToLower(rune(ch))))
res[i] = res[i] + string(unicode.ToUpper(rune(ch)))
}
} else {
for i := 0; i < n; i++ {
res[i] = res[i] + string(ch)
}
}
}
return res
}