刷题笔记-DFS、递归

题目描述-括号生成

https://leetcode-cn.com/problems/generate-parentheses/comments/

递归

永远的暴力解法

class Solution {
public:
    vector<string> generateParenthesis(int n) {
        vector<string> vec;
        //n为0时,直接输出
        if(n==0)
        {
            string s;
            vec.push_back(s);
            return vec;
        }
        //前面i对括号,后面在()里面放n-i-1个括号,不会重复
        for(int i=0; i<n; i++)
        {
            //i为0时,vector长度为1
            vector<string> vfront = generateParenthesis(i);
            vector<string> vback = generateParenthesis(n-i-1);
            for(int k=0; k<vfront.size(); k++)
            {
                for(int l=0; l<vback.size(); l++)
                {
                    string pair = "()";
                    string sfront = vfront[k];
                    string sback = vback.at(l);
                    pair.insert(1, sback);//把sbck放进括号里
                    sfront.append(pair);//连接sfront 和 pair
                    vec.push_back(sfront);
                }
            }
        }
        return vec;
    }
};

题目描述-电话号码的字母组合

https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/

DFS

class Solution {
public:
    //自定义函数和给定函数公用的参数    
    vector<string> vec;
    //注意map的定义方法    
    map<char,string> pairs={{'2',"abc"},{'3',"def"},{'4',"ghi"},{'5',"jkl"},{'6',"mno"},{'7',"pqrs"},{'8',"tuv"},{'9',"wxyz"}};
    
    vector<string> letterCombinations(string digits) {
       if(digits.length()==0)
           return vec;
      int i =0;
      generate("", i, digits);
      return vec;    
      }    
      //DFS
      void generate(string s, int i, string digits)    
      {        
      	if(digits[i]=='\0')
      	{      
      	      vec.push_back(s);            
      	      return;        
      	}        
      	string tmp = pairs[digits[i]];//从map中读取值用[]        
      	for(char w : tmp)//遍历字符串中的字符            
      	generate(s+w, i+1, digits);//在string后面增加字符可以用“+”        
      	//i++;    
      	}
     };
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值