首页 > 其他分享 >【Hot100】LeetCode—17. 电话号码的字母组合

【Hot100】LeetCode—17. 电话号码的字母组合

时间:2024-08-28 09:54:38浏览次数:14  
标签:digits index String numToStr res Hot100 字母组合 sb LeetCode

目录



1- 思路

String数组(哈希表) + 回溯

思路

  • 通过 String 数组实现哈希表,存储 0-9 的哈希表映射

回溯三部曲

  • ① 参数及返回值
    • numToStr:String 的哈希表,用来存储 0-9 的映射
    • digits:输入的 字符串,比如 “56”
    • index :因为需要通过 具体的数字,去 numToStr 中取出映射结果,因此 index 用来记录 digits 遍历到了哪一位
  • ② 终止条件
    • index 达到了 digits 的长度
    • 此时收集结果,将 sb.toString 收集到 res
  • ③ 回溯逻辑
    • 3.1 通过 index 来获取映射的子字符串 str
    • 3.2 通过回溯遍历子字符串 str 收集结果

2- 实现

⭐17. 电话号码的字母组合——题解思路

在这里插入图片描述

class Solution {

    List<String> res = new ArrayList<>();

    public List<String> letterCombinations(String digits) {
        if(digits.length() == 0 || digits == ""){
            return res;
        }

        String[] numToStr = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};

        backTracing(digits,numToStr,0);
        return res;
    }

    StringBuilder sb = new StringBuilder();
    public void backTracing(String digits,String[] numToStr,int index){
        // 结果收集,终止条件
        if(digits.length() == index){
            res.add(sb.toString());
            return;
        }

        // 获取当前映射子串
        String str = numToStr[digits.charAt(index)-'0'];
        for(int i = 0 ; i < str.length() ;i++){
            sb.append(str.charAt(i));
            backTracing(digits,numToStr,index+1);
            sb.deleteCharAt(sb.length()-1);
        }
    }
}

3- ACM 实现

package Daily_LC.Month8_Week4.Day140;

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * Solution4
 *
 * @author alcohol
 * @Description
 * @since 2024-08-27 11:35
 */
public class Solution4 {


    static List<String> res = new ArrayList<>();
    public static List<String> combination(String digits){
        if(digits.length()==0 || digits==""){
            return res;
        }
        String[] numToStr = {"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        backTracing(digits,numToStr,0);
        return res;
    }

    static StringBuilder sb = new StringBuilder();
    public static void backTracing(String digits,String[] numsToString,int index){
        // 终止条件
        if(index == digits.length()){
            res.add(sb.toString());
            return;
        }

        String str = numsToString[digits.charAt(index)-'0'];
        for(int i = 0 ; i < str.length();i++){
            sb.append(str.charAt(i));
            backTracing(digits,numsToString,index+1);
            sb.deleteCharAt(sb.length()-1);
        }
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String input = sc.nextLine();
        combination(input);
        System.out.println("结果是"+res.toString());
    }
}

标签:digits,index,String,numToStr,res,Hot100,字母组合,sb,LeetCode
From: https://blog.csdn.net/weixin_44382896/article/details/141600517

相关文章

  • 【Leetcode_Hot100】普通数组
    普通数组53.最大子数组和56.合并区间189.轮转数组238.除自身以外数组的乘积41.缺失的第一个正数53.最大子数组和方法一:暴力解依次遍历数组中的每个子数组,进而判断res的最大值超时classSolution{publicintmaxSubArray(int[]nums){intres=0;......
  • 135. 分发糖果(leetcode)
    https://leetcode.cn/problems/candy/description/贪心,策略是确定一侧的正确性,再确定另一侧的正确性,最后综合作为正确答案,其中先确定一侧的正确性是局部最优,确定两侧的正确性的局部最优,且找不到反例就可以推出全局最优答案classSolution{publicintcandy(int[]ra......
  • 程序员必备的的5个刷题网站。大厂面试稳了 力扣 https://leetcode.cn
    程序员必备的的5个刷题网站。大厂面试稳了力扣https://leetcode.cn1、leetcode力扣。网址:https://leetcode.cnLeetCode是一个定位为求职的刷题网站,其中又以算法题为主。很多大厂在面试的时候,都会考算法。有空就刷一刷这里面的算法题,你的算法水平肯定会有大幅的提升,不管是求职,......
  • LeetCode 算法:爬楼梯 c++
    原题链接......
  • 搜索二维矩阵 II(LeetCode)
    题目编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。解题"""时间复杂度为O(m+n),其中m是矩阵的行数,n是矩阵的列数。"""defsearchMatrix(matrix,t......
  • 每日一题:Leetcode-47 全排列
    力扣题目解题思路java代码力扣题目:给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。示例1:输入:nums=[1,1,2]输出:[[1,1,2],[1,2,1],[2,1,1]]示例2:输入:nums=[1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]解......
  • 【Leetcode 2032 】 至少在两个数组中出现的值 —— 哈希表与按位运算符(最全的注解)
    给你三个整数数组 nums1、nums2 和 nums3 ,请你构造并返回一个 元素各不相同的 数组,且由 至少 在 两个 数组中出现的所有值组成。数组中的元素可以按 任意 顺序排列。示例1:输入:nums1=[1,1,3,2],nums2=[2,3],nums3=[3]输出:[3,2]解释:至少在两个数组中出......
  • LeetCode刷题笔记8.19-8.24
    LeetCode刷题笔记8.19-8.2476.最小覆盖子串(8.19)算法常见技巧——滑动窗口滑动窗口即维护一个窗口(特定数据结构),来替代暴力遍历子结构这种“笨办法”窗口所涉及到的元素由left和right两个指针选定,选定范围从(left,right]开始,随着right指针向后遍历,寻找符合题意的某个可行解......
  • LeetCode 690. 员工的重要性(哈希表、深度优先搜索dfs)
    题目:690.员工的重要性思路:先用哈希表map将每个员工的信息映射到员工ID对应的下标位置。接着使用深度优先搜索dfs,来记录总和即可。细节看注释/*//DefinitionforEmployee.classEmployee{public:intid;intimportance;vector<int>subordinates;......
  • Java | Leetcode Java题解之第374题猜数字大小
    题目:题解:publicclassSolutionextendsGuessGame{publicintguessNumber(intn){intleft=1,right=n;while(left<right){//循环直至区间左右端点相同intmid=left+(right-left)/2;//防止计算时溢出......