leetcode:电话号码的字母组合回溯法java

本文介绍了一种使用回溯算法解决电话号码字母组合问题的方法。通过将数字映射到对应的字母,采用递归回溯的方式生成所有可能的组合。文章详细展示了算法实现的代码,并通过实例演示了如何调用函数获取电话号码的所有可能组合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

大牛们第一次用回溯,写前几天刚看了,有问题谢谢帮指出。谢谢你们的支持! 

package LeetCode;

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

public class PhoneNumeber {
    static List<List<Character>> res;
    static StringBuffer results =new StringBuffer();;
    static List<String> cc;
    static  List<List<Character>> datas=new ArrayList<>();;
    public List<String> letterCombinations(String digits) {
        res=new ArrayList<>();
        StringBuffer results =new StringBuffer();
        cc=new ArrayList<>();

        /*

        大致的思路:一个数字为一个数组数组中是长度为三的封装成List<char[3]>的数组;
        */
        if(digits.length()<=0){
            return new ArrayList<String>();
        }
        if (datas.size()!=8){
            //首先把相应的数字对应的字母放到相应的数组中去while就是
        for(int i=0;i<26;){
           List<Character>strings=new ArrayList<>();
            strings.add ((char)(97+i));
            ++i;
            strings.add((char) (97+i));
            ++i;
            strings.add ((char) (97+i));
           ++i;
            if(i==18||i==25){
                strings.add((char) (97+i));
                ++i;
            }
            datas.add(strings);
        }
        }
        //因为是从2开始所有m-2,res为存放相应数字对应的字符数组放到结果集中
        for(int j=0;j<digits.length();j++){
            int m=digits.charAt(j)-48;
            res.add(datas.get(m-2));
        }
        stringpj(0);
        return cc;


    }

    //回溯法 取值 匹配 并放入到最终结果集中
    public void stringpj(int n) {

        for (int i = 0; i <res.get(n).size() ; i++) {
            if (n == res.size()-1) {
                 cc.add(results.toString()+ res.get(n).get(i) +"");
            } else {

                /*if(n>0&&i!=0){
                  results.deleteCharAt(results.length()-1);
                }*/
                 results.append( res.get(n).get(i) +"" ) ;
                 stringpj(n + 1);

            }
            //新的首位字母比如(“23”)中的af完成后be防止abe出现,开始要把字符串初始化
            if (n==0)results=new StringBuffer();
            //每次最后一个循环后把字符串中的最后一个数据删除不然会出现(“222”)aac,abaa的问题
            if(n!=0&&i==res.get(n).size()-1&&results.length()!=0)results.deleteCharAt(results.length()-1);
        }

    }

    public static void main(String[] args) {
        PhoneNumeber a=new PhoneNumeber();
       // System.out.println(a.letterCombinations("23"));
      //  System.out.println(a.letterCombinations("2"));
        System.out.println(a.letterCombinations("2345"));
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值