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