91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用回溯寫電話號(hào)碼的字母組合

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:代碼隨想錄 ? 作者:程序員Carl ? 2021-10-29 17:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

17.電話號(hào)碼的字母組合

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

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

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

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

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

思路

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

如果輸入"233"呢,那么就三層for循環(huán),如果"2333"呢,就四層for循環(huán).......

大家應(yīng)該感覺出和77.組合遇到的一樣的問題,就是這for循環(huán)的層數(shù)如何寫出來,此時(shí)又是回溯法登場(chǎng)的時(shí)候了。

理解本題后,要解決如下三個(gè)問題:

  1. 數(shù)字和字母如何映射
  2. 兩個(gè)字母就兩個(gè)for循環(huán),三個(gè)字符我就三個(gè)for循環(huán),以此類推,然后發(fā)現(xiàn)代碼根本寫不出來
  3. 輸入1 * #按鍵等等異常情況

數(shù)字和字母如何映射

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

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

回溯法來解決n個(gè)for循環(huán)的問題

對(duì)于回溯法還不了解的同學(xué)看這篇:關(guān)于回溯算法,你該了解這些!

例如:輸入:"23",抽象為樹形結(jié)構(gòu),如圖所示:

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

回溯三部曲:

  • 確定回溯函數(shù)參數(shù)

首先需要一個(gè)字符串s來收集葉子節(jié)點(diǎn)的結(jié)果,然后用一個(gè)字符串?dāng)?shù)組result保存起來,這兩個(gè)變量我依然定義為全局。

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

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

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

代碼如下:

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

例如輸入用例"23",兩個(gè)數(shù)字,那么根節(jié)點(diǎn)往下遞歸兩層就可以了,葉子節(jié)點(diǎn)就是要收集的結(jié)果集。

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

然后收集結(jié)果,結(jié)束本層遞歸。

代碼如下:

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

首先要取index指向的數(shù)字,并找到對(duì)應(yīng)的字符集(手機(jī)鍵盤的字符集)。

然后for循環(huán)來處理這個(gè)字符集,代碼如下:

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

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

因?yàn)楸绢}每一個(gè)數(shù)字代表的是不同集合,也就是求不同集合之間的組合,而77. 組合216.組合總和III都是是求同一個(gè)集合中的組合!

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

代碼中最好考慮這些異常情況,但題目的測(cè)試數(shù)據(jù)中應(yīng)該沒有異常情況的數(shù)據(jù),所以我就沒有加了。

但是要知道會(huì)有這些異常,如果是現(xiàn)場(chǎng)面試中,一定要考慮到!

C++代碼

關(guān)鍵地方都講完了,按照關(guān)于回溯算法,你該了解這些!中的回溯法模板,不難寫出如下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指向的數(shù)字轉(zhuǎn)為int
stringletters=letterMap[digit];//取數(shù)字對(duì)應(yīng)的字符集
for(inti=0;i//處理
backtracking(digits,index+1);//遞歸,注意index+1,一下層要處理下一個(gè)數(shù)字了
s.pop_back();//回溯
}
}
vector<string>letterCombinations(stringdigits){
s.clear();
result.clear();
if(digits.size()==0){
returnresult;
}
backtracking(digits,0);
returnresult;
}
};

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

//版本二
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){//注意參數(shù)的不同
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;

}
};

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

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

總結(jié)

本篇將題目的三個(gè)要點(diǎn)一一列出,并重點(diǎn)強(qiáng)調(diào)了和前面講解過的77. 組合216.組合總和III的區(qū)別,本題是多個(gè)集合求組合,所以在回溯的搜索過程中,都有一些細(xì)節(jié)需要注意的。

其實(shí)本題不算難,但也處處是細(xì)節(jié),大家還要自己親自動(dòng)手寫一寫。

其他語言版本

Java

classSolution{

//設(shè)置全局列表存儲(chǔ)最后的結(jié)果
Listlist=newArrayList<>();

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

}

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

//比如digits如果為"23",num為0,則str表示2對(duì)應(yīng)的abc
publicvoidbackTracking(Stringdigits,String[]numString,intnum){
//遍歷全部一次記錄一次得到的字符串
if(num==digits.length()){
list.add(temp.toString());
return;
}
//str表示當(dāng)前num對(duì)應(yīng)的字符串
Stringstr=numString[digits.charAt(num)-'0'];
for(inti=0;i//c
backTracking(digits,numString,num+1);
//剔除末尾的繼續(xù)嘗試
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]]#取出數(shù)字對(duì)應(yīng)的字符集
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指向的數(shù)字轉(zhuǎn)為int
letters=letterMap[digit]#取數(shù)字對(duì)應(yīng)的字符集
foriinrange(len(letters)):
s+=letters[i]
backtrack(digits,index+1,s)#遞歸,注意index+1,一下層要處理下一個(gè)數(shù)字
s=s[:-1]#回溯
backtrack(digits,0,s)
returnres

責(zé)任編輯:haq
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 編程
    +關(guān)注

    關(guān)注

    90

    文章

    3716

    瀏覽量

    97225
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4971

    瀏覽量

    74035

原文標(biāo)題:電話號(hào)碼的字母組合!

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    多模光纜型號(hào)字母代碼及其含義

    多模光纜的型號(hào)字母代碼通常遵循國際和行業(yè)標(biāo)準(zhǔn),用于標(biāo)識(shí)光纜的類型、結(jié)構(gòu)、護(hù)套材料等關(guān)鍵特性。以下是一些常見的多模光纜型號(hào)字母代碼及其含義: 一、多模光纖類別代碼 OM1:通常帶有橘色護(hù)套,纖芯尺寸為
    的頭像 發(fā)表于 03-06 09:38 ?311次閱讀

    村田如何識(shí)別貼片電容的規(guī)格型號(hào)?

    字母組合表示,如GR、GC、GJ、GM、GQ、KR、LL等。其中,GRM代表普通貼片陶瓷電容,是村田最常用的貼片電容系列。 2、尺寸代碼 :尺寸代碼由數(shù)字組成,表示電容的長(zhǎng)和寬。例如,代碼"32"表示電容尺寸為3.2mm×2.5mm,對(duì)應(yīng)國際通用尺寸1210.其他常見
    的頭像 發(fā)表于 01-15 15:19 ?344次閱讀

    常用電子元器件字母和含義解析

    在電子技術(shù)領(lǐng)域中,電子元器件是構(gòu)成各種電子設(shè)備的基礎(chǔ)。而為了在電路圖、元器件清單、PCB設(shè)計(jì)等環(huán)節(jié)中快速識(shí)別和管理這些元器件,工程師們采用了一套標(biāo)準(zhǔn)的字母或符號(hào)標(biāo)識(shí)系統(tǒng)。 一、電阻(R) 含義 字母
    的頭像 發(fā)表于 12-05 13:45 ?2078次閱讀

    元服務(wù)發(fā)布配置開發(fā)者服務(wù)信息

    ://或https://開頭的合法URL。此選項(xiàng)僅支持中國大陸企業(yè)/個(gè)人開發(fā)者、海外企業(yè)開發(fā)者的應(yīng)用類元服務(wù)。 客服電話號(hào)碼:請(qǐng)使用“國際區(qū)號(hào)/國內(nèi)區(qū)號(hào)-電話號(hào)碼”的格式,如
    發(fā)表于 10-31 17:58

    5.5v法拉電容 后面字母代表什么意思

    文章解析了法拉電容型號(hào)中字母后綴的含義,涵蓋應(yīng)用場(chǎng)景、介質(zhì)材料、封裝形式等,揭示其技術(shù)參數(shù)與性能特點(diǎn)。
    的頭像 發(fā)表于 09-17 09:15 ?906次閱讀
    5.5v法拉電容 后面<b class='flag-5'>字母</b>代表什么意思

    如何制作字母數(shù)字鍵盤?

    制作字母數(shù)字鍵盤
    發(fā)表于 09-05 07:24

    FLASH燒/編程白皮書

    白皮書:如何燒Flash——不同場(chǎng)景不同需求下的選擇認(rèn)識(shí)Flash?NAND vs. NOR如何燒/編程不同方案比較
    發(fā)表于 07-28 16:05 ?0次下載

    生產(chǎn)線回溯追溯系統(tǒng)選型:中設(shè)智控方案如何破解行業(yè)痛點(diǎn)?

    中設(shè)智控產(chǎn)線回溯追溯方案,從硬件到功能,精準(zhǔn)破解行業(yè)痛點(diǎn),為電子制造、新能源等行業(yè)提供高效、可靠的生產(chǎn)管理工具,助力企業(yè)實(shí)現(xiàn)智能化生產(chǎn)升級(jí),值得選型參考。
    的頭像 發(fā)表于 07-18 11:19 ?985次閱讀
    生產(chǎn)線<b class='flag-5'>回溯</b>追溯系統(tǒng)選型:中設(shè)智控方案如何破解行業(yè)痛點(diǎn)?

    單模光纜型號(hào)字母代碼及其含義

    單模光纜的型號(hào)字母代碼主要用于標(biāo)識(shí)光纜的分類、結(jié)構(gòu)、護(hù)層及光纖類型等關(guān)鍵信息,以下是一些常見的單模光纜型號(hào)字母代碼及其含義: 一、光纜分類代碼 GY:通信用室外光纜,這是最常見的室外光纜分類代碼
    的頭像 發(fā)表于 07-17 10:27 ?3223次閱讀

    組合導(dǎo)航系統(tǒng)如何用單天線實(shí)現(xiàn)低成本?

    在自動(dòng)駕駛、無人機(jī)飛行和航空導(dǎo)航等領(lǐng)域,高精度、高可靠性的定位與姿態(tài)測(cè)量至關(guān)重要,但傳統(tǒng)方案往往因雙天線設(shè)計(jì)或高成本IMU而難以普及。ER-GNSS/MINS-07組合導(dǎo)航系統(tǒng)突破這一瓶頸,以單天線
    的頭像 發(fā)表于 07-04 15:05 ?647次閱讀
    <b class='flag-5'>組合</b>導(dǎo)航系統(tǒng)如<b class='flag-5'>何用</b>單天線實(shí)現(xiàn)低成本?

    山東LP-SCADA故障回溯功能的好處

    關(guān)鍵字:LP-SCADA, LP-SCADA平臺(tái) , LP-SCADA系統(tǒng), 軟件回溯功能,藍(lán)鵬測(cè)控 得益于本平臺(tái)毫秒級(jí)的采集延遲,本平臺(tái)除了具有普通監(jiān)控采集平臺(tái)的所有監(jiān)控功能外,還可用于產(chǎn)線、設(shè)備
    發(fā)表于 05-29 14:42

    答疑|3D打印能打印立體字母嗎?

    最近有朋友留言問:3D打印能打印那種立體字母嗎?會(huì)不會(huì)很難實(shí)現(xiàn)? JLC3D小編來解答:當(dāng)然可以!無論是單獨(dú)的字母,還是組合成單詞或句子,3D打印都可以實(shí)現(xiàn)的。 以下是一些關(guān)于打印立體字母
    發(fā)表于 05-21 16:17

    旺詮合金電阻的命名規(guī)則

    (Ω)為單位。在旺詮合金電阻的命名中,電阻值通常通過數(shù)字或字母組合來表示。例如,“100”可能表示100歐姆的電阻值,而“K”則通常表示千歐姆(kΩ)。 二、精度 精度表示電阻值的準(zhǔn)確度,通常以百分比來表示。旺詮合金電阻的精度等級(jí)通
    的頭像 發(fā)表于 05-20 11:22 ?654次閱讀
    旺詮合金電阻的命名規(guī)則

    阻燃耐火電線型號(hào)字母歸納

    阻燃耐火電線的型號(hào)字母表示通常涉及阻燃和耐火特性的標(biāo)識(shí),以下是對(duì)這些字母的詳細(xì)歸納: 阻燃特性標(biāo)識(shí) ZR:這是最常見的阻燃電線標(biāo)識(shí),表示電線具有阻燃特性。例如,ZR-YJV表示阻燃銅芯聚氯乙烯絕緣
    的頭像 發(fā)表于 05-09 10:31 ?9301次閱讀

    防火雙絞線是什么字母

    防火雙絞線的標(biāo)識(shí)字母主要取決于其符合的防火標(biāo)準(zhǔn)或認(rèn)證體系,常見的標(biāo)識(shí)方式如下: 1. 國際通用標(biāo)準(zhǔn)(如UL認(rèn)證) CMP/CMR/CM: CMP(Plenum):最高阻燃等級(jí),適用于通風(fēng)管道或空氣
    的頭像 發(fā)表于 04-03 09:49 ?1084次閱讀