• [Swift]LeetCode784. 字母大小写全排列 | Letter Case Permutation


    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址: https://www.cnblogs.com/strengthen/p/10543320.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    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.

    Examples:
    Input: S = "a1b2"
    Output: ["a1b2", "a1B2", "A1b2", "A1B2"]
    
    Input: S = "3z4"
    Output: ["3z4", "3Z4"]
    
    Input: S = "12345"
    Output: ["12345"]
    

    Note:

    • S will be a string with length between 1 and 12.
    • S will consist only of letters or digits.

    给定一个字符串S,通过将字符串S中的每个字母转变大小写,我们可以获得一个新的字符串。返回所有可能得到的字符串集合。

    示例:
    输入: S = "a1b2"
    输出: ["a1b2", "a1B2", "A1b2", "A1B2"]
    
    输入: S = "3z4"
    输出: ["3z4", "3Z4"]
    
    输入: S = "12345"
    输出: ["12345"]
    

    注意:

    • S 的长度不超过12
    • S 仅由数字和字母组成。

    96ms

     1 class Solution {
     2     func letterCasePermutation(_ S: String) -> [String] {
     3         let arr = Array(S.uppercased().cString(using: .ascii)!)
     4         var ans = [String]()
     5         ans.reserveCapacity(1024)
     6         
     7         var tmp = [CChar](repeating: 0, count: arr.count + 1)
     8         
     9         func step(_ tmp: inout [CChar], _ idx: Int) {
    10             if idx == arr.count - 1 {
    11                 ans.append(String(cString: tmp))
    12             } else if arr[idx] < 65 {
    13                 tmp[idx] = arr[idx]
    14                 step(&tmp, idx + 1)
    15             } else {
    16                 tmp[idx] = arr[idx]
    17                 step(&tmp, idx + 1)
    18                 tmp[idx] = arr[idx] + 32
    19                 step(&tmp, idx + 1)
    20             }            
    21         }
    22         
    23         step(&tmp, 0)        
    24         return ans
    25     }
    26 }

    112ms

     1 class Solution {
     2     func letterCasePermutation(_ S: String) -> [String] {
     3 var list: [String] = []
     4     if S.isEmpty {
     5         return [S]
     6     }
     7     
     8     if let _ = Int(S) {
     9         return [S]
    10     }
    11     var source = S
    12     for _ in 0..<source.count {
    13         let c = source.removeFirst()
    14         letterCaseRec(c: c, list: &list)
    15     }    
    16         return list
    17     }
    18     
    19     
    20     func letterCaseRec(c: Character, list: inout [String]) {
    21     
    22     var opp:String? = nil
    23     if list.isEmpty {
    24         list.append(String(c))
    25         if let _ = Int(String(c)) {
    26         } else {
    27             opp = String(c) == String(c).capitalized ? String(c).lowercased() :  String(c).capitalized
    28              list.append(opp!)
    29         }
    30        return
    31     }
    32     
    33     if let _ = Int(String(c)) {
    34         for x in 0..<list.count {
    35             list[x].append(c)
    36         }
    37     } else {
    38         opp = String(c) == String(c).capitalized ? String(c).lowercased() :  String(c).capitalized
    39         let size = list.count
    40         for x in 0..<size {
    41             let current = list[x]
    42             list.append(current + opp!)
    43             list[x].append(c)          
    44         }
    45     }
    46   }    
    47 }

    116ms

     1 class Solution {
     2     
     3      func letterCasePermutation(_ S: String) -> [String] {
     4         var result = [String]()
     5         letterCasePermutation(S, 0, "", &result)
     6         return result
     7     }
     8     
     9     func letterCasePermutation(_ S: String, _ index: Int, _ currentS: String, _ result: inout [String]) {
    10         if index >= S.count {
    11             result.append(currentS)
    12             return
    13         }
    14     
    15         let char = S[S.index(S.startIndex, offsetBy: index)]
    16         letterCasePermutation(S, index+1, (currentS+String(char).lowercased()), &result)
    17         if let c = char.unicodeScalars.first, CharacterSet.letters.contains(c) {
    18             letterCasePermutation(S, index+1, (currentS+String(char).uppercased()), &result)
    19         }
    20     }
    21 }

    124ms

     1 class Solution {
     2     func letterCasePermutation(_ S: String) -> [String] {
     3         var cur = String(), res = [String]()
     4         var sChars = Array(S)
     5         recursion(&sChars, 0, &res)
     6         return res
     7     }
     8     
     9     private func recursion(_ sChars: inout [Character], _ i: Int, _ res: inout [String]) {
    10         if i == sChars.count {
    11             res.append(String(sChars))
    12             return
    13         }
    14         
    15         recursion(&sChars, i + 1, &res)
    16     
    17         if sChars[i] >= "0" && sChars[i] <= "9" { return } // it a number
    18         sChars[i] = toggleCase(sChars[i])
    19         recursion(&sChars, i + 1, &res)
    20         sChars[i] = toggleCase(sChars[i])
    21         
    22     }
    23     
    24     private func toggleCase(_ char: Character) -> Character {
    25         let s = String(char)
    26         if s.uppercased() == s {
    27             return Character(s.lowercased())
    28         } else {
    29             return Character(s.uppercased())
    30         }
    31     }
    32 }

    128ms

     1 class Solution {
     2     func letterCasePermutation(_ S: String) -> [String] {
     3         var result = [String]()
     4         result.append(S.lowercased())
     5         if Int(S) != nil {
     6             return result
     7         }
     8         for (k,i) in S.enumerated() {
     9             if(Int(String(i)) != nil) {
    10                 continue
    11             }
    12             for j in 0..<result.count {
    13                 var entry = Array(result[j])
    14                 entry[k] = Character(String(entry[k]).uppercased())
    15                 result.append(String(entry))
    16             }
    17         
    18         }
    19         return result
    20     }
    21 }

    132ms

     1 class Solution {
     2     func patternToString(_ pattern: String, _ source: String) -> String {
     3         var result = ""
     4         var posInPattern = 0
     5         let upperSource = source.uppercased()
     6         for i in 0..<source.count {
     7             let s = source[source.index(source.startIndex, offsetBy: i)]
     8             if s >= "a" && s <= "z" {
     9                 let S = upperSource[upperSource.index(upperSource.startIndex, offsetBy: i)]
    10                 result.append(pattern[pattern.index(pattern.startIndex, offsetBy: posInPattern)] == "0" ? s : S)
    11                 posInPattern += 1
    12             } else {
    13                 result.append(s)
    14             }
    15         }
    16         return result
    17     }
    18     
    19     func letterCasePermutation(_ S: String) -> [String] {
    20         let s = S.lowercased()
    21         var count = 1
    22         var bitCount = 0
    23         for c in s {
    24             if c >= "a" && c <= "z" {
    25                 count *= 2
    26                 bitCount += 1
    27             }
    28         }
    29         
    30         guard bitCount > 0 else {
    31             return [S]
    32         }
    33         
    34         var result = [String]()
    35         for i in 0..<count {
    36             var binStr = String(i, radix: 2)
    37             if binStr.count < bitCount {
    38                 binStr = String(repeating: "0", count: bitCount - binStr.count) + binStr
    39             }
    40             result.append(patternToString(binStr, s))
    41         }
    42         return result
    43     }
    44 }

    140ms

     1 class Solution {
     2     func letterCasePermutation(_ S: String) -> [String] {
     3         var result = [String]()
     4         dfs(S, 0, "", &result, S.count)
     5         return result
     6     }
     7     
     8     func dfs(_ S: String, 
     9              _ index: Int,
    10              _ currentS: String, 
    11              _ result: inout [String],
    12              _ lengthS: Int) {
    13         if index >= lengthS {
    14             result.append(currentS)
    15             return
    16         }
    17     
    18         let char = S[S.index(S.startIndex, offsetBy: index)]
    19         dfs(S, 
    20             index+1, 
    21             (currentS+String(char).lowercased()),
    22             &result,
    23             lengthS)
    24         if let c = char.unicodeScalars.first, CharacterSet.letters.contains(c) {
    25             dfs(S, 
    26                 index+1,
    27                 (currentS+String(char).uppercased()),
    28                 &result,
    29                 lengthS)
    30         }
    31     }        
    32 }

    180ms

     1 class Solution {
     2     func letterCasePermutation(_ S: String) -> [String] {
     3         var res: [[String]] = [[]]
     4 
     5         for char in S {
     6             if isAlpha(char) {
     7                 for i in 0..<res.count {
     8                     res.append(res[i])
     9                     res[i].append(String(char).lowercased())
    10                     res[res.count-1].append(String(char).uppercased())
    11                 }
    12             } else {
    13                 for (i, var s) in res.enumerated() {
    14                     s.append(String(char))
    15                     res[i] = s
    16                 }
    17             }
    18         }
    19 
    20         return res.map { $0.joined() }
    21     }
    22 
    23     private func isAlpha(_ char: Character) -> Bool {
    24         if let value = char.unicodeScalars.first?.value {
    25             if (value > 64 && value < 91) || (value > 96 && value < 123) {
    26                 return true;
    27             }
    28         }
    29         return false;
    30     }
    31 }

    Runtime: 196 ms
    Memory Usage: 20.5 MB
     1 class Solution {
     2     func letterCasePermutation(_ S: String) -> [String] {
     3         var S = S
     4         var res:[String] = [String]()
     5         helper(&S, 0, &res)
     6         return res
     7     }
     8     
     9     func helper(_ s:inout String,_ pos:Int,_ res:inout [String])
    10     {
    11         var arrChar:[Character] = Array(s)
    12         var arrInt:[Int] = arrChar.map{$0.ascii}
    13         if pos == s.count
    14         {
    15             res.append(s)
    16             return
    17         }
    18         helper(&s, pos + 1, &res)
    19         if arrInt[pos] > 57
    20         {
    21             arrInt[pos] ^= 32;
    22             arrChar = arrInt.map{$0.ASCII}
    23             s = String(arrChar)
    24             helper(&s, pos + 1, &res);
    25         }
    26     }
    27 }
    28 
    29 //String扩展
    30 extension String {        
    31     //subscript函数可以检索数组中的值
    32     //直接按照索引方式截取指定索引的字符
    33     subscript (_ i: Int) -> Character {
    34         //读取字符
    35         get {return self[index(startIndex, offsetBy: i)]}
    36     }
    37 }
    38 
    39 //Character扩展 
    40 extension Character  
    41 {  
    42   //Character转ASCII整数值(定义小写为整数值)
    43    var ascii: Int {
    44        get {
    45            return Int(self.unicodeScalars.first?.value ?? 0)
    46        }       
    47     }    
    48 }
    49 
    50 //Int扩展
    51 extension Int
    52 {
    53     //Int转Character,ASCII值(定义大写为字符值)
    54     var ASCII:Character 
    55     {
    56         get {return Character(UnicodeScalar(self)!)}
    57     }
    58 }

    232ms

     1 class Solution {
     2     var res = [String]()
     3     func letterCasePermutation(_ S: String) -> [String] {
     4         var wordsArr = [String]()
     5         for c in S{
     6             wordsArr.append(String(c))
     7         }
     8         dps("",wordsArr)
     9         return res
    10     }
    11     
    12     func dps(_ head:String, _ foot:[String]) -> Void{
    13         if foot.count == 0{
    14             res.append(head)
    15             return
    16         }
    17         var s:String = foot.first!
    18         var newfoot = foot
    19         newfoot.removeFirst()
    20         if s <= "9" {
    21             dps(head+s,newfoot)
    22         }else{
    23             dps(head+String(s.lowercased()),newfoot)
    24             dps(head+String(s.uppercased()),newfoot)
    25         }
    26     }    
    27 }

    256ms

     1 class Solution {
     2     func letterCasePermutation(_ S: String) -> [String] {
     3         
     4         func isNum( _ s : String) -> Bool {
     5             let scan = Scanner(string: s)
     6             var val : Int = 0
     7             return scan.scanInt(&val) && scan.isAtEnd
     8         }
     9         
    10         func char(at i : Int, _ s : String) -> String {
    11             return String(s[s.index(s.startIndex, offsetBy: i)])
    12         }
    13         
    14         var source : [String] = []
    15         for i in 0 ..< S.count {
    16             source.append(char(at: i, S))
    17         }
    18         var res = [String]()
    19         let n = S.count
    20         func backTrace(t : Int, src : [String], s :  String) {
    21             if t >= n {
    22                 res.append(s)
    23             } else {
    24                 if isNum(source[t]) {
    25                     backTrace(t: t+1, src: source, s: s+source[t])
    26                     return
    27                 }
    28                 for i in 0 ... 1 {
    29                     if i == 0 { //小写
    30                         backTrace(t: t+1, src: source, s: s+source[t].lowercased())
    31                         
    32                     } else { // i == 1 大写
    33                         backTrace(t: t+1, src: source, s: s+source[t].uppercased())
    34                     }
    35                 }
    36             }
    37         }
    38         backTrace(t: 0, src: source, s: "")
    39         return res
    40     }
    41 }
  • 相关阅读:
    python_24_test
    python_23_tuple
    python_22_enumerate
    python_20_列表
    python_21_copy
    python_19_编码解码
    python_18_三元运算
    python_16_自己建立模块
    关于主键(PRIMARY KEY)和自增(AUTO_INCREMENT)结合使用的知识点
    MySQL root用户忘记密码怎么办?修改密码方法:skip-grant-tables
  • 原文地址:https://www.cnblogs.com/strengthen/p/10543320.html
Copyright © 2020-2023  润新知