1. 程式人生 > 其它 >力扣 題目17-- 電話號碼的字母組合

力扣 題目17-- 電話號碼的字母組合

題目


題解


這題我們可以發現用四層迴圈(即迴圈第一個數字的字母然後裡面套著第二個數字的字母 全部遍歷然後輸出)應該可以解決這個問題

但是既然是演算法題還是中等我們應該另闢蹊徑(好像可以用回溯演算法 但是這裡我這裡採用了其他暴力?方法)

觀察結果

輸出:["ad","ae","af","bd","be","bf","cd","ce","cf"]

那麼我們可不可以先把第一個數字的字母全部放進去 然後再去迴圈第二個呢

即 第一輪迴圈 

輸出:["a","a","a","b","b","b","c","c","c"]

第二輪迴圈 

輸出:["ad","ae","af","bd","be","
bf","cd","ce","cf"]

1.先建立一個vector

vector<string> Telephone = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };

這樣下標就是對應數字

2.先獲取一下最後結果有多少種可能性即 數字代表字母個數相乘 由於別忘了用resize將返回的result擴大到number 個空間

        int number = 1;
        for (int i = 0; i < digits.size(); i++)
        {
            number 
= number * Telephone[digits[i] - 48].size(); } result.resize(number); int number2 = number;

3.遍歷

先固定digits的數字->再判斷要迴圈的次數(看看是否到number 不是就繼續迴圈)->然後迴圈一遍數字代表的字串->將字串放進對應的空間

for (int i = 0; i < digits.size(); i++) {
            int size = Telephone[digits[i] - 48].size();
            
for (int h = 0; h < number2;) { for (int j = 0; j < size; j++) { for (int g = (number / size) * j+h; g < (number / size) * (j + 1) + h; g++) { result[g] = result[g] + Telephone[digits[i] - 48][j]; } } h = h + number; } number = number / Telephone[digits[i] - 48].size(); }

4.如果為空需要直接返回

vector<string> result = {};
if (digits == "") {
            return result;
        }

程式碼


 1 #include<iostream>
 2 #include<string>
 3 #include<vector>
 4 using namespace std;
 5 vector<string> Telephone = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };
 6 class Solution {
 7 public:
 8     vector<string> letterCombinations(string digits) {
 9         vector<string> result = {};
10         if (digits == "") {
11             return result;
12         }
13         int number = 1;
14         for (int i = 0; i < digits.size(); i++)
15         {
16             number = number * Telephone[digits[i] - 48].size();
17         }
18         result.resize(number);
19         int number2 = number;
20         for (int i = 0; i < digits.size(); i++) {
21             int size = Telephone[digits[i] - 48].size();
22             for (int h = 0; h < number2;) {
23                 for (int j = 0; j < size; j++) {
24                     for (int g = (number / size) * j+h; g < (number / size) * (j + 1) + h; g++) {
25                         result[g] = result[g] + Telephone[digits[i] - 48][j];
26                     }
27                 }
28                 h = h + number;
29             }
30             number = number / Telephone[digits[i] - 48].size();
31         }
32         return result;
33     }
34 };
35 int main() {
36     Solution sol;
37     string digits = "789";
38     vector<string> result = sol.letterCombinations(digits);
39     for (vector<string> ::iterator it = result.begin(); it != result.end(); it++) {
40         cout << *it << endl;
41     }
42 }
點選這裡看程式碼