第十七题:电话号码的字母组合

2024-09-07 23:52

本文主要是介绍第十七题:电话号码的字母组合,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目描述

给定一个仅包含数字 2-9 的字符串,返回所有可能的由它组成的字母组合。你可以假设输入字符串至少包含一个数字,并且不超过3位数字。

实现思路

使用哈希表或数组存储每个数字对应的字符,然后通过递归或迭代的方式生成所有可能的组合。如果字符串长度为n,则可以看作是n层循环,每层循环可以选择对应数字的所有字符之一。

算法实现

C语言实现

#include <stdio.h>
#include <stdlib.h>
#include <string.h>void backtrack(char *digits, int pos, char *combination, int *resultLength, char **result) {static const char *table[] = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"};if (pos == strlen(digits)) {result[*resultLength] = malloc(strlen(combination) + 1);strcpy(result[*resultLength], combination);(*resultLength)++;} else {for (int i = 0; table[digits[pos] - '0'][i]; ++i) {combination[pos] = table[digits[pos] - '0'][i];backtrack(digits, pos + 1, combination, resultLength, result);}}
}int* letterCombinations(char *digits, int *returnSize) {if (!strlen(digits)) return NULL;int resultLength = 0;char *combination[100] = {0};*returnSize = 0;backtrack(digits, 0, (char[5]){0}, &resultLength, combination);int *result = malloc(resultLength * sizeof(int));for (int i = 0; i < resultLength; ++i) {result[i] = (int)combination[i];}return result;
}

Python实现

class Solution:def letterCombinations(self, digits: str) -> List[str]:if not digits:return []phoneMap = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz'}def backtrack(combination, next_digits):if not next_digits:combinations.append(combination)else:for letter in phoneMap[next_digits[0]]:backtrack(combination + letter, next_digits[1:])combinations = []backtrack("", digits)return combinations

Java实现

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;public class Solution {public List<String> letterCombinations(String digits) {List<String> combinations = new ArrayList<>();if (digits.length() == 0) {return combinations;}Map<Character, String> phoneMap = new HashMap<>();phoneMap.put('2', "abc"); phoneMap.put('3', "def"); phoneMap.put('4', "ghi");phoneMap.put('5', "jkl"); phoneMap.put('6', "mno"); phoneMap.put('7', "pqrs");phoneMap.put('8', "tuv"); phoneMap.put('9', "wxyz");backtrack(combinations, phoneMap, digits, 0, new StringBuilder());return combinations;}private void backtrack(List<String> combinations, Map<Character, String> phoneMap, String digits, int index, StringBuilder combination) {if (index == digits.length()) {combinations.add(combination.toString());} else {String letters = phoneMap.get(digits.charAt(index));for (int i = 0; i < letters.length(); i++) {combination.append(letters.charAt(i));backtrack(combinations, phoneMap, digits, index + 1, combination);combination.deleteCharAt(index);}}}
}

时间复杂度

O(4^n * n),其中n是输入字符串的长度。因为最多会有4个选项('7’和’9’有4个选项,其他数字有3个选项),并且对于每一个组合,我们都需要额外的时间来构造这个字符串。

这篇关于第十七题:电话号码的字母组合的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1146527

相关文章

Django 第十七课 -- 视图 - FBV 与 CBV

目录 一. 前言 二. FBV 三. CBV 一. 前言 FBV(function base views) 基于函数的视图,就是在视图里使用函数处理请求。 CBV(class base views) 基于类的视图,就是在视图里使用类处理请求。 二. FBV 基于函数的视图其实我们前面章节一直在使用,就是使用了函数来处理用户的请求,查看以下实例: 路由配置: urlpat

代码随想录算法训练营第十九天| 回溯理论、77. 组合、216. 组合总和Ⅲ、17. 电话号码的字母组合

今日内容 回溯的理论基础leetcode. 77 组合leetcode. 216 组合总和Ⅲleetcode. 17 电话号码的字母组合 回溯理论基础 回溯法也叫回溯搜索法,它是一种搜索的方式,而且只要有递归就会有回溯,回溯就是递归的副产品。 回溯说到底并不是什么非常高深的搜索方式,本质上仍然是穷举,穷举所有可能然后选择出我们要的答案。剪枝会使回溯法更加高效一点,但改变不了回溯本质就是穷举

android根据电话号码查询联系人名称,导出通讯录所有联系人的方法

/**      * 根据电话号码取得联系人姓名      */     public static String getContactNameByPhoneNumber(Context context, String address) {         String[] projection = { ContactsContract.PhoneLookup.DISPLAY_NA

算法打卡 Day28(回溯算法)-组合总数 + 组合总数 Ⅱ+ 电话号码的字母组合

文章目录 Leetcode 17-电话号码的字母组合题目描述解题思路 Leetcode 39-组合总数题目描述解题思路 Leetcode 216-组合总数 Ⅲ题目描述解题思路 Leetcode 17-电话号码的字母组合 题目描述 https://leetcode.cn/problems/letter-combinations-of-a-phone-number/descrip

LintCode 电话号码的字母组合

Given a digit string excluded 01, return all possible letter combinations that the number could represent. A mapping of digit to letters (just like on the telephone buttons) is given below. 样例 给定 “

VBA代码解决方案第十七讲:如何选择一个工作表,选择多个工作表

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程,目前已经是第三版修订了。这套教程定位于入门后的提高,在学习这套教程过程中,侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码摆好。 这套教程共三册,一百四十七讲,内容覆盖较广,也是初级和中级间的过渡教程,改版后的内容主要是提供程序源码文件及代码修正为32位和64位兼用代码。今后一段

POJ1002电话号码字符串

题目意思: 输入一个串,里面包含一些数字和一些大写字母,以及 - ,字母变换成数字,保证了7个数字,输出重复出现超多1次的电话号码以及次数。规模1e5。 粽子,被这个题目坑了很久,首先是用字符串保存最后的电话号码,二维sort好像不能用,但是string可以用sort,一直wa,今天发现了两个错误,一个是最后扫描个数的时候,会漏掉最后面的一个号码,调整过来又wa了,因为如果只有一组数据,输出了

回溯——3.电话号码的字母组合

力扣题目链接 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 输入:"23"输出:["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. 解题思路总结: 映射表建立: 通过letterMap将数字0-9与对应的字母集合关联起来。递归生成组合: 使

第十七题(找出字符串中第一个只出现一次的字符)

题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b o(n^2)时间复杂度的方法比较简单,遍历每一个字符,将其和后面的每个字符进行比较,若没有相同的,那么这个字符就是要寻找的字符。 要实现更低阶的时间复杂度,我们可以采用空间换时间的思想,采用哈希表解决这个问题。利用一次循环统计每个字符出现的次数,然后找出出现次数为1的字符即可,哈希表的键为字符,值为字符对应的出

Leetcode 17. 电话号码的字母组合 C++实现

Leetcode 17. 电话号码的字母组合 问题:给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 算法:递归嵌套,先获取 digits 长度 n ,如果为 0 则直接返回空数组。创建 path 数组,path 数组的单个位置的长度由 digits 长度 n 来决定,有