[Estructura de datos y algoritmo] El algoritmo de combinación de letras del teclado del número de teléfono

Dada una cadena que contiene solo números del 2 al 9, devuelve todas las combinaciones de letras que pueda representar.

1. Requisitos de la asignatura
  • La asignación de números a letras se da de la siguiente manera (igual que los botones del teléfono).
    Nota: 1 no corresponde a ninguna letra.

Inserte la descripción de la imagen aquí

  • Los ejemplos son los siguientes:
	输入:"23"
	输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]
  • Nota: Aunque las respuestas anteriores están organizadas en orden lexicográfico, puede elegir el orden en el que se emiten las respuestas.
Dos, ejemplo de algoritmo
  • Ideas
    • La idea para resolver este problema es relativamente simple. Cada número en una cadena tiene varias letras, por ejemplo, 2 corresponde a: 3 abc, 3 corresponde a 3 def, 4 corresponde a 3 ghi, luego 234 corresponde a 3 * 3 * 3 La combinación de relojes, reducida al código, es un bucle for de tres capas. En otras palabras, digits.count determina cuántos niveles de bucles for, luego se anidan los N niveles correspondientes de bucles for, y es mejor utilizar métodos recursivos.
    • La construcción de la función recursiva todavía se basa en la idea del bucle for, la diferencia es el mecanismo de salida de la función recursiva, la combinación de las letras correspondientes y las condiciones de recolección y el procesamiento del índice del subbucle.
  • Swift ejemplo uno
	var listRes = [String]()

    let map : [Character:[Character]] = {
    
    
      return ["2":Array("abc"),
              "3":Array("def"),
              "4":Array("ghi"),
              "5":Array("jkl"),
              "6":Array("mno"),
              "7":Array("pqrs"),
              "8":Array("tuv"),
              "9":Array("wxyz")
              ]
    }()

    func letterCombinations(_ digits: String) -> [String] {
    
    
      if digits.count == 0 {
    
    
        return []
      }
      search("", Array(digits), 0)
      return listRes  
    }

    func search(_ s:String,_ digits: [Character],_ index:Int) {
    
    
      //! 1.terminator
      if index==digits.count {
    
    
        listRes.append(s)
        return
      }
    
      //! 2. process
      let letters = map[digits[index]]!
      for j in 0..<letters.count {
    
    
        //! drill down
        search(s+String(letters[j]), digits, index+1)
      }
  }
  • Ejemplo rápido dos
	let matchTable: [Int : [String]] = [2 : ["a", "b", "c"],
                                        3 : ["d", "e", "f"],
                                        4 : ["g", "h", "i"],
                                        5 : ["j", "k", "l"],
                                        6 : ["m", "n", "o"],
                                        7 : ["p", "q", "r", "s"],
                                        8 : ["t", "u", "v"],
                                        9 : ["w", "x", "y", "z"]]
    
    func letterCombinations(_ digits: String) -> [String] {
    
    
        if digits == "" {
    
    
            // 避免map的时候返回 [""]
            return []
        }
        // Set中任何元素只出现一次
        var ret: Set<String> = []
        var i = 0
        while i < 5000 {
    
    
            var str = ""
            for c in digits {
    
    
                let val = Int(String(c))!
                // 取随机内容
                str += matchTable[val]!.randomElement()!
            }
            ret.insert(str)
            i += 1
        }
        return ret.map {
    
     (str) -> String in
            return str
        }
    }

Supongo que te gusta

Origin blog.csdn.net/Forever_wj/article/details/108655421
Recomendado
Clasificación