leetcode刷题笔记十七 电话号码的组合 Scala版本

leetcode刷题笔记十七 电话号码的组合 Scala版本

源地址:17. 电话号码的字母组合

题目描述:

Given a string containing digits from 2-9 inclusive, return all possible letter combinations that the number could represent.

A mapping of digit to letters (just like on the telephone buttons) is given below. Note that 1 does not map to any letters.

Example:

Input: "23"
Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

Note:

Although the above answer is in lexicographical order, your answer could be in any order you want.

简要思路分析:

本题可以通过尾递归、DFS或BFS解决

代码补充:

//尾递归版本
import scala.collection.mutable
object Solution {
    //定义键盘位置与字母的映射关系
    val Mmap = Map(('2'->"abc"),('3'->"edf"),('4'->"ghi"),('5'->"jkl"),('6'->"mno"),('7'->"pqrs"),('8'->"tuv"),('9'->"wxyz")).mapValues(_.toList)
    //主函数
    def letterCombinations(digits: String): List[String] = {
        //构建尾递归
        def tailRec(digits:String, strList:List[String]):List[String] = {
            //当digits串为空时,所有映射已经完成,直接返回
            //否则的话,将当前digits的首字母拼接在strList尾部
            //对digits剩下的字符串进行尾递归
            if (digits.length == 0) strList
            else tailRec(digits.tail,strList.flatMap(x => Mmap(digits.head).map(y => x+y)))
        }

        if(digits.length == 0) return List()
        else return tailRec(digits, List("")) 
    }
}
//DFS版本
import scala.collection.mutable.ListBuffer

object Solution {
    val digitsMap:Map[Char,List[String]] = Map('2'->List("a","b","c"), '3'->List("d","e","f"), '4'->List("g","h","i"),
    '5'->List("j","k","l"), '6'->List("m","n","o"), '7'->List("p","q","r","s"),
    '8'->List("t","u","v"), '9'->List("w","x","y","z"))
    def letterCombinations(digits: String): List[String] = {
      val ansList = ListBuffer[String]()
      if (digits.length == 0) return List()
      //调用DSF方法  
      letterDSF(digits,0,"",ansList)
      ansList.toList
    }

    def letterDSF(digits:String, iCur:Int, tempAns:String, ansList:ListBuffer[String]) : Unit = {
      val  digitLetter = digitsMap(digits(iCur))
      //当前字母位置是digits字符串尾部,一次深度遍历完成,返回  
      if (iCur == digits.length-1){
        digitLetter.foreach(elem => ansList.append(tempAns+elem))
        return
      }
       //否则将当前字母记录,串长+1
      digitLetter.map(elem => letterDSF(digits,iCur+1,tempAns+elem,ansList))
  }
}
//BFS版本
import scala.collection.mutable.ListBuffer

object Solution {
   val digitsMap:Map[Char,List[String]] = Map('2'->List("a","b","c"), '3'->List("d","e","f"), '4'->List("g","h","i"),
    '5'->List("j","k","l"), '6'->List("m","n","o"), '7'->List("p","q","r","s"),
    '8'->List("t","u","v"), '9'->List("w","x","y","z"))

  
    def letterCombinations(digits: String): List[String] = {
      var ansList = ListBuffer[String]()
      if (digits.length == 0) return List()
      
      //将digits(0) 加入队列  
      val letter0 = digitsMap(digits(0))
      letter0.map(elem =>ansList.append(elem))
      //println(ansList.toList)  
      
      需要进行digits.length-2次入队出队  
      for (iCur <- 1 until digits.length){
        val tempList = ListBuffer[String]()
		//对当前队列中的子串取出来与当前可能的字母拼接
        for(eleChar <- ansList){
           //println(elem1)
           val letter = digitsMap(digits(iCur))
           letter.map(elem =>       tempList.append(eleChar + elem))
           //println(tempList)
           //拼接后的List放入队列
           ansList = tempList
        }
      }

      return ansList.toList
posted @ 2020-04-18 21:30  ganshuoos  阅读(170)  评论(0编辑  收藏  举报