色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用回溯寫電話號碼的字母組合

算法與數據結構 ? 來源:代碼隨想錄 ? 作者:程序員Carl ? 2021-10-29 17:06 ? 次閱讀

17.電話號碼的字母組合

力扣題目鏈接//leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

給定一個僅包含數字 2-9 的字符串,返回所有它能表示的字母組合。

給出數字到字母的映射如下(與電話按鍵相同)。注意 1 不對應任何字母。

示例: 輸入:"23" 輸出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

說明:盡管上面的答案是按字典序排列的,但是你可以任意選擇答案輸出的順序。

思路

從示例上來說,輸入"23",最直接的想法就是兩層for循環遍歷了吧,正好把組合的情況都輸出了。

如果輸入"233"呢,那么就三層for循環,如果"2333"呢,就四層for循環.......

大家應該感覺出和77.組合遇到的一樣的問題,就是這for循環的層數如何寫出來,此時又是回溯法登場的時候了。

理解本題后,要解決如下三個問題:

  1. 數字和字母如何映射
  2. 兩個字母就兩個for循環,三個字符我就三個for循環,以此類推,然后發現代碼根本寫不出來
  3. 輸入1 * #按鍵等等異常情況

數字和字母如何映射

可以使用map或者定義一個二位數組,例如:string letterMap[10],來做映射,我這里定義一個二維數組,代碼如下:

conststringletterMap[10]={
"",//0
"",//1
"abc",//2
"def",//3
"ghi",//4
"jkl",//5
"mno",//6
"pqrs",//7
"tuv",//8
"wxyz",//9
};

回溯法來解決n個for循環的問題

對于回溯法還不了解的同學看這篇:關于回溯算法,你該了解這些!

例如:輸入:"23",抽象為樹形結構,如圖所示:

圖中可以看出遍歷的深度,就是輸入"23"的長度,而葉子節點就是我們要收集的結果,輸出["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]。

回溯三部曲:

  • 確定回溯函數參數

首先需要一個字符串s來收集葉子節點的結果,然后用一個字符串數組result保存起來,這兩個變量我依然定義為全局。

再來看參數,參數指定是有題目中給的string digits,然后還要有一個參數就是int型的index。

注意這個index可不是77.組合216.組合總和III中的startIndex了。

這個index是記錄遍歷第幾個數字了,就是用來遍歷digits的(題目中給出數字字符串),同時index也表示樹的深度。

代碼如下:

vectorresult;
strings;
voidbacktracking(conststring&digits,intindex)
  • 確定終止條件

例如輸入用例"23",兩個數字,那么根節點往下遞歸兩層就可以了,葉子節點就是要收集的結果集。

那么終止條件就是如果index 等于 輸入的數字個數(digits.size)了(本來index就是用來遍歷digits的)。

然后收集結果,結束本層遞歸。

代碼如下:

if(index==digits.size()){
result.push_back(s);
return;
}
  • 確定單層遍歷邏輯

首先要取index指向的數字,并找到對應的字符集(手機鍵盤的字符集)。

然后for循環來處理這個字符集,代碼如下:

intdigit=digits[index]-'0';//將index指向的數字轉為int
stringletters=letterMap[digit];//取數字對應的字符集
for(inti=0;i//處理
backtracking(digits,index+1);//遞歸,注意index+1,一下層要處理下一個數字了
s.pop_back();//回溯
}

注意這里for循環,可不像是在回溯算法:求組合問題!回溯算法:求組合總和!中從startIndex開始遍歷的

因為本題每一個數字代表的是不同集合,也就是求不同集合之間的組合,而77. 組合216.組合總和III都是是求同一個集合中的組合!

注意:輸入1 * #按鍵等等異常情況

代碼中最好考慮這些異常情況,但題目的測試數據中應該沒有異常情況的數據,所以我就沒有加了。

但是要知道會有這些異常,如果是現場面試中,一定要考慮到!

C++代碼

關鍵地方都講完了,按照關于回溯算法,你該了解這些!中的回溯法模板,不難寫出如下C++代碼:

//版本一
classSolution{
private:
conststringletterMap[10]={
"",//0
"",//1
"abc",//2
"def",//3
"ghi",//4
"jkl",//5
"mno",//6
"pqrs",//7
"tuv",//8
"wxyz",//9
};
public:
vector<string>result;
strings;
voidbacktracking(conststring&digits,intindex){
if(index==digits.size()){
result.push_back(s);
return;
}
intdigit=digits[index]-'0';//將index指向的數字轉為int
stringletters=letterMap[digit];//取數字對應的字符集
for(inti=0;i//處理
backtracking(digits,index+1);//遞歸,注意index+1,一下層要處理下一個數字了
s.pop_back();//回溯
}
}
vector<string>letterCombinations(stringdigits){
s.clear();
result.clear();
if(digits.size()==0){
returnresult;
}
backtracking(digits,0);
returnresult;
}
};

一些寫法,是把回溯的過程放在遞歸函數里了,例如如下代碼,我可以寫成這樣:(注意注釋中不一樣的地方)

//版本二
classSolution{
private:
conststringletterMap[10]={
"",//0
"",//1
"abc",//2
"def",//3
"ghi",//4
"jkl",//5
"mno",//6
"pqrs",//7
"tuv",//8
"wxyz",//9
};
public:
vector<string>result;
voidgetCombinations(conststring&digits,intindex,conststring&s){//注意參數的不同
if(index==digits.size()){
result.push_back(s);
return;
}
intdigit=digits[index]-'0';
stringletters=letterMap[digit];
for(inti=0;i1,s+letters[i]);//注意這里的不同
}
}
vector<string>letterCombinations(stringdigits){
result.clear();
if(digits.size()==0){
returnresult;
}
getCombinations(digits,0,"");
returnresult;

}
};

我不建議把回溯藏在遞歸的參數里這種寫法,很不直觀,我在二叉樹:以為使用了遞歸,其實還隱藏著回溯這篇文章中也深度分析了,回溯隱藏在了哪里。

所以大家可以按照版本一來寫就可以了。

總結

本篇將題目的三個要點一一列出,并重點強調了和前面講解過的77. 組合216.組合總和III的區別,本題是多個集合求組合,所以在回溯的搜索過程中,都有一些細節需要注意的。

其實本題不算難,但也處處是細節,大家還要自己親自動手寫一寫。

其他語言版本

Java

classSolution{

//設置全局列表存儲最后的結果
Listlist=newArrayList<>();

publicListletterCombinations(Stringdigits){
if(digits==null||digits.length()==0){
returnlist;
}
//初始對應所有的數字,為了直接對應2-9,新增了兩個無效的字符串""
String[]numString={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
//迭代處理
backTracking(digits,numString,0);
returnlist;

}

//每次迭代獲取一個字符串,所以會設計大量的字符串拼接,所以這里選擇更為高效的StringBuild
StringBuildertemp=newStringBuilder();

//比如digits如果為"23",num為0,則str表示2對應的abc
publicvoidbackTracking(Stringdigits,String[]numString,intnum){
//遍歷全部一次記錄一次得到的字符串
if(num==digits.length()){
list.add(temp.toString());
return;
}
//str表示當前num對應的字符串
Stringstr=numString[digits.charAt(num)-'0'];
for(inti=0;i//c
backTracking(digits,numString,num+1);
//剔除末尾的繼續嘗試
temp.deleteCharAt(temp.length()-1);
}
}
}

Python

classSolution:
ans=[]
s=''
letterMap={
'2':'abc',
'3':'def',
'4':'ghi',
'5':'jkl',
'6':'mno',
'7':'pqrs',
'8':'tuv',
'9':'wxyz'
}

defletterCombinations(self,digits):
self.ans.clear()
ifdigits=='':
returnself.ans
self.backtracking(digits,0)
returnself.ans

defbacktracking(self,digits,index):
ifindex==len(digits):
self.ans.append(self.s)
return
else:
letters=self.letterMap[digits[index]]#取出數字對應的字符集
forletterinletters:
self.s=self.s+letter#處理
self.backtracking(digits,index+1)
self.s=self.s[:-1]#回溯

python3

classSolution:
defletterCombinations(self,digits:str)->List[str]:
res=[]
s=""
letterMap=["","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"]
ifnotlen(digits):returnres
defbacktrack(digits,index,s):
ifindex==len(digits):
returnres.append(s)
digit=int(digits[index])#將index指向的數字轉為int
letters=letterMap[digit]#取數字對應的字符集
foriinrange(len(letters)):
s+=letters[i]
backtrack(digits,index+1,s)#遞歸,注意index+1,一下層要處理下一個數字
s=s[:-1]#回溯
backtrack(digits,0,s)
returnres

責任編輯:haq
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程
    +關注

    關注

    88

    文章

    3628

    瀏覽量

    93816
  • 代碼
    +關注

    關注

    30

    文章

    4803

    瀏覽量

    68752

原文標題:電話號碼的字母組合!

文章出處:【微信號:TheAlgorithm,微信公眾號:算法與數據結構】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    貼片電容代理-貼片電容的標志方法

    貼片電容的標志方法主要包括以下幾種: 一、標識識別法 字母和數字組合:在貼片電容的表面,會印有由字母和數字組成的編碼。其中,字母通常表示電容量的前兩位數字,而后面的數字則表示在前面的數
    的頭像 發表于 11-12 16:43 ?266次閱讀

    AFE76xx作為使用回送模式的單芯片寬帶中繼器

    電子發燒友網站提供《AFE76xx作為使用回送模式的單芯片寬帶中繼器.pdf》資料免費下載
    發表于 10-08 11:30 ?0次下載
    AFE76xx作為使<b class='flag-5'>用回</b>送模式的單芯片寬帶中繼器

    RVBacktrace RISC-V極簡棧回溯組件

    RVBacktrace組件簡介一個極簡的RISC-V棧回溯組件。功能在需要的地方調用組件提供的唯一API,開始當前環境的棧回溯支持輸出addr2line需要的命令,使用addr2line進行棧回溯支持結合反匯編,棧
    的頭像 發表于 09-15 08:12 ?414次閱讀
    RVBacktrace RISC-V極簡棧<b class='flag-5'>回溯</b>組件

    110配線架可用于什么地方?rj4模塊化配線架可用于什么地方?

    數據能夠穩定、高速地傳輸。它支持高帶寬和高速率的數據傳輸,滿足現代計算機網絡對性能和可靠性的要求。 電話網絡:110配線架也常用于電話網絡中,可以接入多個電話號碼,實現電話呼叫的分配和
    的頭像 發表于 09-11 09:55 ?612次閱讀

    西克傳感器型號字母表達的意思

    傳感器系列,“DFS”可能代表編碼器系列等。這些字母組合是區分不同產品類別的關鍵。 二、性能與特性 型號中的某些字母可能表示傳感器的特定性能或特性。例如,某些字母可能代表傳感器的探測距離、響應速度、防護等級等。然而,這些
    的頭像 發表于 09-04 10:08 ?1204次閱讀

    電話配線架怎么跟電話程控交換機連接

    電話配線架與電話程控交換機的連接方式主要依賴于電話系統的具體架構和需求。一般來說,連接過程可以概述為以下幾個步驟: 一、了解設備 電話配線架:主要用于將主干
    的頭像 發表于 08-22 10:18 ?878次閱讀

    回溯英特爾在跨越半個世紀的發展歷程

    我們以英特爾三位風云人物的三句名言為線索,回溯英特爾在跨越半個世紀的發展歷程中,如何利用芯片技術的力量,影響信息時代,開啟未來之門。
    的頭像 發表于 08-16 14:58 ?653次閱讀

    鴻蒙開發電話服務:【@ohos.telephony.call (撥打電話)】

    call模塊提供呼叫管理功能,包括撥打電話、跳轉到撥號界面、獲取通話狀態、格式化電話號碼等。
    的頭像 發表于 06-15 09:13 ?846次閱讀
    鴻蒙開發<b class='flag-5'>電話</b>服務:【@ohos.telephony.call (撥打<b class='flag-5'>電話</b>)】

    求助,關于STM32上開發函數調用堆棧回溯的問題求解

    1、stm32f1系列 2、上了FreeRTOS 3、想開發函數調用回溯功能 在編譯選項中增加了--use_frame_pointer,編程一個正常的程序(之前一直run的),測試發現,程序啟動即crash,請問有沒有高手之前遇到過?
    發表于 05-10 07:32

    20多年專注語音合成芯片公司分享:TTS芯片端是如何達到100%精準合成的

    ”,大家可以讀讀看。 再例如數字“1”,電話號碼“010-62986600、15321801789”,日期“2018-01-01”,在電話號碼中大家習慣讀成“幺”,而在日期里又習慣性的讀成“一”。 這樣的場景還有很多很多,本文將向大家介紹在TTS芯片端,如遇到無法智能識
    的頭像 發表于 05-06 15:45 ?630次閱讀

    基于NE555的電話鈴聲電路

    使用555IC的電話鈴聲電路是一個簡單的電路或設備,每當有人撥打您的電話號碼時都會發出警報聲。
    的頭像 發表于 05-05 11:11 ?862次閱讀
    基于NE555的<b class='flag-5'>電話</b>鈴聲電路

    谷歌電話應用新增“查找號碼”功能,提升陌生來電識別效率

    細心的用戶AssembleDebug首先發現了這個功能。在谷歌電話應用的測試版本中,若用戶點擊電話記錄內的陌生號碼,便可找到一個名為“查找號碼”的按鍵。點擊此按鍵,谷歌能將所點
    的頭像 發表于 04-07 11:42 ?581次閱讀

    鴻蒙實戰應用開發:【撥打電話】功能

    電話相關信息的功能 效果預覽 使用說明 1.輸入電話號碼后,點擊電話按鈕,進行撥打電話。 2.撥打電話后文本框會顯示撥打是否成功,是否存在
    發表于 03-04 20:22

    谷歌測試搜索新功能:幫用戶減少等待接通客服時間

    根據谷歌的詳細說明,當用戶在Google搜索客服電話信息后,會在結果頁面找到“Request a call”圖表,提供了深入通信的意圖和電話號碼的填寫位置。
    的頭像 發表于 02-19 13:51 ?552次閱讀

    什么是衛星電話 衛星電話和普通電話區別

    衛星電話是一種通過衛星通信技術進行語音通信的設備或服務。與傳統的普通電話相比,衛星電話具有以下幾個顯著的區別。 首先,衛星電話具有全球覆蓋的能力。傳統的普通
    的頭像 發表于 02-02 16:50 ?1.5w次閱讀
    主站蜘蛛池模板: 日韩美女爱爱| 中文字幕在线观看亚洲视频| 99午夜高清在线视频在观看| 美美哒高清在线播放8| 99视频在线观看免费视频| 人妻兽虐曲| 国产露脸150部国语对白| 一区在线观看在线| 欧美大jiji| 国产人妻人伦精品久久久| 中国老女人xxhd69| 秋霞在线观看视频一区二区三区| 国产AV亚洲国产AV麻豆| 一个人免费观看在线视频播放| 女人高潮时一吸一夹| 国产久久热99视频| 98久久人妻无码精品系列蜜桃| 色翁荡熄月月| 看美女大腿中间的部分| 福利一区国产| 真人做受120分钟免费看| 色多多深夜福利免费观看| 精品日韩二区三区精品视频| 波多野结衣教师系列6| 亚洲精品嫩草AV在线观看| 秋秋影视午夜福利高清| 花蝴蝶高清在线视频免费观看 | 国产精品自在在线午夜精品| 张津瑜的9分58秒7段免费 | 鞋奴的视频VK| 嗯啊插的好深啊使劲抽视频| 国产自产第一区c国产| seyeye免费高清观看| 永久免费在线看mv| 无遮18禁在线永久免费观看挡| 伦理片qvod| 乌克兰少妇大胆大BBW| 伦理79电影网在线观看| 国产欧美无码亚洲| 精品99久久久久成人网站| abp-146|