给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。
输入:"23" 输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"].

大致思路(三个版本

1.  第一想法是检索数字种类数目,然后输出

但是有的点没想到,有可能出现单独的数字

void letterCombinations(string digits)
{vector<string> res;int arr[9] = { 0,0,0,0,0,0,0,0,0 };int count = 0;//检测一共有多少种数字for (int i = 0; i < digits.length() && count != 8; ++i){if ((digits[i] - 48) >= 1 && (digits[i] - 48) <= 9){arr[(digits[i] - 48) - 1]++;if (arr[(digits[i] - 48) - 1] == 1)count++;}}string str[8] = { "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };for (int i = 0; i < 9; ++i){string t = "";if (arr[i] == 0)continue;for (int j = i + 1; j < 9; ++j){if (arr[j] == 0)continue;for (int h = 0; h < str[i].length(); ++h){for (int z = 0; z < str[j].length(); ++z){t = "";t += str[i - 1][h];t += str[j - 1][z];cout << t << endl;}}}}return ;
}

2.  检索数字的种类,然后标记数字单个种类的数目,限制为2最大
     解决了单个数字问题以及重复数字问题,但是新的问题出来了,数字的组合是不限制位数的,可能是三个的组合。
    虽然可以根据count来暴力解决,但是不想做了已经(最大十八层循环,会死人的
    此方法,原地爆炸。

class Solution {
public:vector<string> letterCombinations(string digits){vector<string> res;int arr[10] = { 0,0,0,0,0,0,0,0,0 };int count = 0;//检测一共有多少种数字for (int i = 0; i < digits.length() && count != 8; ++i){if ((digits[i] - 48) >= 1 && (digits[i] - 48) <= 9){if (arr[(digits[i] - 48)] != 2)arr[(digits[i] - 48)]++;if (arr[(digits[i] - 48)] == 1)count++;}}//构造一个全新的字符串string numstr = "";for (int i = 0; i < 10; ++i){for (int j = 0; j < arr[i]; ++j)numstr += (char)(i + 48);}string str[10] = { "","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz" };if (count == 1 && numstr.length() == 1){for (int i = 0; i < 10; ++i){if (arr[i] == 0)continue;else{string t = "";for (int j = 0; j < str[i].length(); ++j){t = str[i][j];res.push_back(t);}}}}elsefor (int i = 0; i < numstr.length(); ++i){for (int j = i + 1; j < numstr.length(); ++j){for (int h = 0; h < str[numstr[i] - 48].length(); ++h){string t = "";for (int z = 0; z < str[numstr[j] - 48].length(); ++z){t = "";t += str[numstr[i] - 48][h];t += str[numstr[j] - 48][z];res.push_back(t);}}}}return res;}
};

3. 看了一眼官方题解,有了个全排列的思路,但是又一想貌似又不对。

官方题解:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/dian-hua-hao-ma-de-zi-mu-zu-he-by-leetcode/

1. 有用树来解决排列组合问题的,但是复杂度太大了吧。
 2. 还看到一个java的队列解法,但是没看懂。(https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/javafei-chang-jing-qiao-de-dui-lie-jie-fa-by-xxxzz/)
 3. c++的迭代解法(https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/solution/cdie-dai-by-yang-xin/)

力扣:电话号码的字母组合相关推荐

  1. 《LeetCode力扣练习》第17题 电话号码的字母组合 Java

    <LeetCode力扣练习>第17题 电话号码的字母组合 Java 一.资源 题目: 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合.答案可以按 任意顺序 返回. 给出数 ...

  2. 电话号码的字母组合(力扣17)

    题目描述 题目链接:力扣https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/ 给定一个仅包含数字 2-9 的字 ...

  3. <力扣>中等17.电话号码的字母组合

    力扣 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/letter-combinations-of-a-phone-number 著作权归领扣网络所有. ...

  4. 刷爆力扣之电话号码的字母组合

    刷爆力扣之电话号码的字母组合 HELLO,各位看官大大好,我是阿呆

  5. python【力扣LeetCode算法题库】17-电话号码的字母组合

    电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23" ...

  6. 力扣(LeetCode)刷题,简单+中等题(第34期)

    目录 第1题:整数转罗马数字 第2题:电话号码的字母组合 第3题:二叉树的所有路径 第4题:砖墙 第5题:下一个排列 第6题:括号生成 第7题:删除并获得点数 第8题:全排列 第9题:颜色分类 第10 ...

  7. LeetCode 17电话号码的字母组合(搜索)18四数之和

    电话号码的字母组合 题目描述 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合. 给出数字到字母的映射如下(与电话按键相同).注意 1 不对应任何字母. 示例: 输入:"23 ...

  8. 力扣(简单+中等)50题整理总结

    文章目录 前言 一.简单题 1. 两数之和 7. 整数反转 9. 回文数 13. 罗马数字转整数 14. 最长公共前缀 20. 有效的括号 21. 合并两个有序链表 26. 删除有序数组中的重复项 2 ...

  9. 算法训练Day25 | LeetCode216. 组合总和III(和77.组合很像!);LeetCode17. 电话号码的字母组合(不同集合中组合)

    目录 LeetCode216. 组合总和III 1. 思路 2. 代码实现 3. 剪枝 4. 复杂度分析 5. 思考与收获 LeetCode17. 电话号码的字母组合 1. 思路 2. 代码实现 3. ...

  10. 教你创建电脑、手机同步的markdown云笔记--力扣刷题力荐!

    开篇先致歉 其他不谈,开篇必须先给各位读者道个歉,年后工作上比较忙,加上最近闲暇的时间都用来在力扣上刷算法题了,导致公众号断更有些严重啊.再加上年后将健身减重提上了日程,时间上就更显的捉襟见肘了. 不 ...

最新文章

  1. 只需3kbps就能清晰通话,这个谷歌音频工具开源了!
  2. 女大男9岁 我们不可以么
  3. 文巾解题 189. 旋转数组
  4. What Influences Method Call Performance in Java?--reference
  5. 猿辅导、作业帮忙“圈钱”,跟谁学、有道、51Talk狂“烧钱”,在线教育钱途在哪?
  6. 校运动会c语言程序编写,校运动会管理系统报告C语言(含完整代码)
  7. linux mysql 修改root密码_Mac下重置mysql的root密码
  8. C++ vector使用的一些注意事项
  9. Android应用开发—setResult()的调用时机
  10. 线性规划与多目标规划
  11. C/C++中数组作为函数形参后退化为指针
  12. Harbor快速部署到Kubernetes集群及登录问题解决
  13. There is no Action mapped for namespace / and action name .
  14. linux 命令行美化
  15. SQL2005安装及连接
  16. 卡皇稳了,RTX3090获鲁大师Q1季度最强显卡!
  17. pip 在c盘的文件路径
  18. 常见鸟的种类及特点_湿地鸟类种类及分布特点
  19. (转载)香椿熟了————————食得春之鲜:香椿拌香干
  20. src refspec xxx does not match any 错误处理办法

热门文章

  1. 哪些原因会导致TFT LCD显示屏偏色?
  2. 数据传输 -- 字符串报文
  3. 2018-2-13-win10-UWP--蜘蛛网效果
  4. 学习FPGA之二:云端加速
  5. 在英文版的remix部署,拿到部署地址在中文版的remix 中 合约地址中输入地址,再部署可以实现调用 java调用智能合约Unmatched arguments from index 2
  6. 俄罗斯方块游戏开发 ——图形化编程java swing 项目
  7. 高尔顿与回归分析的起源
  8. Java Servlet3.0使用getPart/getParts实现单文件和多文件上传
  9. 58同城2014校园招聘软件测试笔试题
  10. 电脑提高或开启高性能模式