首页 > 其他分享 >LC 17.电话号码的字母组合

LC 17.电话号码的字母组合

时间:2024-03-15 11:30:12浏览次数:23  
标签:digits LC 递归 length 17 回溯 字母组合 path

17.电话号码的字母组合

给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。

给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。

示例 1:

输入: digits = “23”
输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]

示例 2:

输入: digits = “”
输出:[]

示例 3:

输入: digits = “2”
输出:[“a”,“b”,“c”]

提示:

  • 0 ≤ d i g i t s . l e n g t h ≤ 4 0 \leq digits.length \leq 4 0≤digits.length≤4
  • digits[i] 是范围 ['2', '9'] 的一个数字。

解法一(回溯)

思路分析:

  1. 根据题意,该题为字母组合问题,使用回溯算法来解决
  2. 首先是回溯三要素
    1. 思考返回值和参数,因为题目要求获得字符组合,并不需要返回值,即返回类型为void,然后需要一个参数来表示当前递归的高度,其余参数需要时再添加
    2. 思考递归结束条件,即当递归高度与字符串digits长度一致时,保存记录的字符组合,并结束该层递归
    3. 思考回溯的一般过程,即根据递归高度确定所需遍历的字符串,然后进行组合,并继续选择字符,然后执行回溯操作

实现代码如下:

class Solution {
	char[][] charArr = new char[][]{
			{' '},
			{' '},
			{'a', 'b', 'c'},
			{'d', 'e', 'f'},
			{'g', 'h', 'i'},
			{'j', 'k', 'l'},
			{'m', 'n', 'o'},
			{'p', 'q', 'r', 's'},
			{'t', 'u', 'v'},
			{'w', 'x', 'y', 'z'}
	};
	List<String> ans = new ArrayList<>();
	StringBuffer path = new StringBuffer();
	public List<String> letterCombinations(String digits) {
		if (digits.isEmpty())
			return ans;	// 特殊情况
		backtracking(digits.length(), 0, digits);
		return ans;
    }
	private void backtracking(int high, int currentHigh, String digits) {
		if (currentHigh == high) {
			// 获得一个字符组合
			ans.add(path.toString());
			return ;
		}
		// 根据当前递归高度 获取待选取的字符数组
		int index = digits.charAt(currentHigh) - '0';
		for (char ch : charArr[index]) {
			path.append(ch);
			backtracking(high, currentHigh+1, digits);
			path.deleteCharAt(path.length()-1);
		}
	}
}

提交结果如下:

解答成功:
执行耗时:0 ms,击败了100.00% 的Java用户
内存消耗:41.2 MB,击败了14.59% 的Java用户

复杂度分析:

  • 时间复杂度: O ( n × m ) O(n \times m) O(n×m),n是字符串digits的长度,m是数字所代表的字母数目
  • 空间复杂度: O ( n ) O(n) O(n),即digits的长度

标签:digits,LC,递归,length,17,回溯,字母组合,path
From: https://blog.csdn.net/qq_61457746/article/details/136735005

相关文章

  • 超低功耗LCD显示段码驱动芯片VKL128 LQFP44 适用于扫地机器人/燃气表-原厂技术支持
    VKL128概述:VKL128是一个点阵式存储映射的LCD驱动器,可支持最大128点(32SEGx4COM)的LCD屏。单片机可通过I2C接口配置显示参数和读写显示数据,可配置4种功耗模式,也可通过关显示和关振荡器进入省电模式。其高抗干扰,低功耗的特性适用于水电气表以及工控仪表类产品。功能特点:•   ......
  • 科普:DO-178B
    ​对航空航天领域的工业软件设计来说,安全无疑是重中之重,而在众多安全准则中,最为关键也最具影响力的就是DO-178B。▲DO-178B软件生命周期过程关系图 01.什么是DO-178B?DO-178B的全称为“机载系统设备合格审定中的软件考虑”,发布于1992年,由无线电航空技术委员会(RTCA,RadioTechn......
  • 代码随想录算法训练营第day17|110.平衡二叉树 、 257. 二叉树的所有路径 、404.左叶子
    目录a.110.平衡二叉树b.257.二叉树的所有路径 c.404.左叶子之和a.110.平衡二叉树力扣题目链接(opensnewwindow)给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例1......
  • 在工厂项目中,我是用这个读取PLC数据的
    ApachePLC4X软件介绍ApachePLC4X旨在创建一组库,以统一的方式与工业级可编程逻辑控制器(PLCs)进行通信。目前,支持以下语言:JavaGoC(尚未可用)Python(尚未可用)C#(.Net)(已废弃)功能特点PLC4X设计目标之一是为开发人员提供简化的API,隐藏底层通信细节,以便与各种......
  • lc2035 将数组分成两个数组并最小化数组和的差
    给你一个长度为2n的整数数组,需要将它分成两个长度为n的数组,分别求出两个数组的和,并最小化两个数组和之差的绝对值。nums中每个元素都需要放入两个数组之一,求最小的数组和之差。1<=n<=15;-1E7<=nums[i]<=1E7直接暴搜的话最坏时间复杂度是O(2^30),会TLE,可以使用双向dfs优化,每次df......
  • lc1755 最接近目标值的子序列和
    给你一个整数数组nums和一个目标值goal,需要从nums中选出一个子序列,使子序列元素总和最接近goal,返回abs(sum-goal)可能的最小值。数组的子序列指通过移除原数组中的某些元素(可能全部或无)而形成的数组。1<=nums.length<=40;-1e7<=nums[i]<=1e7;-1e9<=goal<=1e9值域过大,不能用背......
  • halcon绘制图形
    1、ROI是Halcon中的一个很重要的概念,为了减少计算量,只关注待检测物体或该物体周围的一片区域即可(类似于图片裁剪)*ROI是Halcon中的一个很重要的概念,为了减少计算量,只关注待检测物体或该物体周围的一片区域即可,*ROI就是图像处理所关注的区域*read_image读取图像数据......
  • odoo17开发教程(7):用户界面UI的交互-菜单
    声明菜单menuitem为了减少声明菜单(ir.ui.menu)并将其连接到相应操作的复杂性,我们可以使用<menuitem>快捷方式。 还是拿 test_model_action举例,一个最简单的菜单如下:<menuitemid="test_model_menu_action"action="test_model_action"/>菜单test_model_menu_action......
  • odoo17开发教程(5):权限的简单介绍
    在之前的文章中,我们创建了第一个用于存储业务数据的表。在Odoo这样的商业应用程序中,首先要考虑的问题之一是谁可以访问数据。Odoo提供了一种安全机制,允许特定用户组访问数据。本章旨在对权限有个最低要求对了解数据文件(CSV)Odoo是一个高度数据驱动的系统。虽然行为是通过......
  • 617. 合并二叉树c
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*/structTreeNode*mergeTrees(structTreeNode*root1,structTreeNode*root2){if(!root1&&!roo......