輸入法九鍵,每個按鍵都代表著不用的字母,我們需要找到不同字影射,來進行不同序列的組成。如下是leetcode第十七題。
給定乙個僅包含數字 2-9 的字串,返回所有它能表示的字母組合。
給出數字到字母的對映如下(與**按鍵相同)。注意 1 不對應任何字母。
示例:輸入:「23」
輸出:[「ad」, 「ae」, 「af」, 「bd」, 「be」, 「bf」, 「cd」, 「ce」, 「cf」].
1. 暴力法
首先還是想到暴力解法,將程式遍歷多次,首先要做的事情是建立好字母的字串的對映,然後將輸入的數字字串串變為數字格式,讓每過乙個數字時,找到對應的字串,該字串中字元放入,再吧其他字串中的字元放入,這種演算法的時間複雜度為o(n3) 具體**如下:
func
lettercombinations
(digits string)[
]string
//把對應的字串輸入
m :=
string
finalout :=
string
for i :=
0; i <
len(digits)
; i++}}
return finalout
}
2. 回溯演算法其次就是回溯演算法,回溯演算法只需要遍歷一次,回溯演算法在表現上很像遞迴演算法,在本題中的表現比較像寬度優先搜尋(bfs),回溯演算法和遞迴演算法的根本的不同是,遞迴演算法滿足某一條件是,必須返回到上一步,這樣不斷返回上一步的演算法,或者不斷呼叫自己的演算法,就是遞迴,即 f(n) = n*f(n-a), 而回溯演算法就是搜尋完這條路徑上所有的可能,然後返回到出發點,重新搜尋。
以例題中的「23」為例,回溯演算法的案例是這樣的:
對於回溯演算法,可以參考以下的**:
result :=
型別func
backtrack
(路徑, 選擇列表):if
(滿足結束條件)
for 選擇 in 選擇列表:
做選擇backtrack
(路徑, 選擇列表)
撤銷選擇
以下是參考**:
func
lettercombinations
(digits string)[
]string
m :=
string
finalout :=
make([
]string,0
)backtrack
(digits,0,
"",m ,
&finalout)
return finalout
}func
backtrack
(digits string
,index int
,comb string
,m [
]string
,finalout *
string
) m := m[digits[index]
-'2'
]for
_,v :=
range m
}
每日一題 LeetCode
在陣列中的兩個數字,如果前面乙個數字大於後面的數字,則這兩個數字組成乙個逆序對。輸入乙個陣列,求出這個陣列中的逆序對的總數。示例 1 輸入 7,5,6,4 輸出 5 限制 0 陣列長度 50000 思想是 分治演算法 所有的 逆序對 於 3 個部分 左邊區間的逆序對 右邊區間的逆序對 橫跨兩個區間的...
LeetCode每日一題(題1028)
最近在刷leetcode每日一題,每次做完之後總能有些收穫,所以想著不如每天寫個部落格記錄一下做的題目的解法以及自己寫的時候問題出在 從先序遍歷還原二叉樹 題目大意 給出乙個字串 1 2 3 4 5 6 7 1代表節點的值,前面的 個數代表節點的深度。如果只有乙個子節點,保證這個節點為左子節點。返回...
LeetCode每日一題(題139)
題目 題目大意 給出乙個字串s和乙個字串陣列words,判斷s是否能夠拆分成多個words中的字串。分析 這道題比較簡單的方式應該是採用動態規劃來做。對於任意乙個字串中的區間,可以判斷該區間組成的字串是否在字典中,如果是,則這個區間的真假取決於前面那個區間的真假。給出狀態轉移方程dp i dp j ...