代码随想录算法训练营第二十五天| 216.组合总和III,17.电话号码的字母组合

216. Combination Sum III

  • 思路
  • java
    class Solution {
    
      // global parameters
        List> result = new ArrayList();
        LinkedList path = new LinkedList();
        int sum = 0;
        
        public List> combinationSum3(int k, int n) {
            helper(k, n, 0, 1);
            return result;
        }
        private void helper(int k, int n, int sum, int startIndex){
          //减枝之后加上去的中止条件  
          if(sum > n){
                return;
            }
          //中止条件
            if(path.size() == k && sum == n){
                result.add(new ArrayList(path));
                return;
            }
            //for循环横向遍历,这里是减枝后的,原始为i

 17. Letter Combinations of a Phone Number

  • 思路
    • java
      class Solution {
          List result = new ArrayList();
          StringBuilder temp = new StringBuilder();
          
          public List letterCombinations(String digits) {
              if(digits == null || digits.length() == 0){
                  return result;
              }
              
              String[] numString = {"", "", "abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
              helper(digits, numString, 0);
              return result;
          }
          private void helper(String digits, String[] numString, int index){
              if(index == digits.length()){
                  result.add(temp.toString());
                  return;
              }
              
              String str = numString[digits.charAt(index) - '0'];//横向遍历(for循环)之前就已经把string选出来了,所以之后for循环遍历也只要从0开始就可以了
              
              for(int i = 0; i < str.length(); i++){
                  temp.append(str.charAt(i));
                  helper(digits, numString, index + 1);//这里不是i+1,由于i =0 开始,如果i+1, 永远都是0+1,也就是说,从第一个数之后,digits.charAt(index)不管几遍取的都是第二位的数,如23456,取的永远是2333
                  temp.deleteCharAt(temp.length()-1);
              }
          }
          
          
      }
      
      
      //也可以把 String str = numString[digits.charAt(index) - '0']放到循环里面
      class Solution {
          List result = new ArrayList();
          StringBuilder temp = new StringBuilder();
          
          public List letterCombinations(String digits) {
              if(digits.length() == 0){
                  return result;
              }
              String[] numString = {"","", "abc", "def", "ghi", "jkl", "mno", "pqrs","tuv", "wxyz"};
              helper(digits, numString, 0);
              return result;
          }
          private void helper(String digits, String[] numString, int index){
              if(index == digits.length() && temp.length() == digits.length()){
                  result.add(temp.toString());
                  return;
              }
              for(int i = index; i < digits.length(); i++){
                  String str = numString[digits.charAt(i) - '0'];
                  //str = "abc"
                  for(char c : str.toCharArray()){
                      temp.append(c);
                      //temp = "a"
                      helper(digits, numString,i+1 );
                      temp.deleteCharAt(temp.length()- 1);
                  }
              }
          }
      }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值