力扣 题目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 }
点击这里看代码

 

posted @ 2022-04-04 11:10  无聊的阿库娅  阅读(36)  评论(0编辑  收藏  举报