zoukankan      html  css  js  c++  java
  • leetCode Letter Combinations of a Phone Number

    方法一:

    • 从digits 的第一字符开始遍历
    • 每次结果都是在之前的结果的基础上,加上当前数字可能的情况: 所以使用一个vector<string> result 存储每次加的结果;最开始为"";
    • 创建一个当前的结果vector<string> temp:要遍历result中的每一个并且遍历当前字符的所有可能,组成新的字符串,加入result vector 中
    class Solution {
    public:
    
        vector<string> letterCombinations(string digits) {
    
    
            vector<string> d={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
            vector<string> result;
            if(digits.size()==0)
                return result;
            result.push_back("");
            int k=digits.size();
            
            for(int i=0;i<k;i++)
            {
                int c=digits[i]-'0';
                if(c<0||c>9) break;
                cout<<c<<endl;
                vector<string>temp;
               for(int j=0;j<d[c].length();j++)
                {
                   for(int m=0;m<result.size();m++)
                   {
                      cout<<d[c][j]<<endl;
                      temp.push_back(result[m]+d[c][j]); 
                   }
    
                }    
                result=temp;
                
                
                
            }
            return result;
    
    
        }
    };
    

      

    方法二:

    这道题类似之前的  遍历二叉树输出所有的路径的题。但是我太弱鸡,开始都没有用dfs做出来:

    使用深度优先搜索:

    • 把最终结果当成dfs 的参数,因为一直要改变,所以是一个引用类型,定义一个参数存储当前拼成的字符串
    • dfs递归的终点,是这个数是最后一个数,
    • 每次迭代的时候,改变当前拼成的字符串
     void dfs(vector<string>& str,string save, string digits, int temp, int l)
        {
            vector<string> d={"","","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
            if(temp==l)
            {
                str.push_back(save);
                return;
            }
                
            int c=digits[temp]-'0';
            int i=0;
            while(i<d[c].length())
            {
                cout<<d[c][i]<<endl;
      
                dfs(str,save+d[c][i],digits,temp+1,l);
    
                i++;
            }
            
        }
        vector<string> letterCombinations(string digits) {
            vector<string> str;
            if(digits.size()==0)
                return str;
            string save;
           
           dfs (str,save, digits,0, digits.size()) ;
            return str;
               
    

      

    在递归传递的时候要主要:

     dfs(str,save+d[c][i],digits,temp+1,l);
    表示传入的参数为save+d[c][i], 而递归之前的save 没有改变;

    如果使用

    save.push_back(d[c][i]);
    dfs(str,save+d[c][i],digits,temp+1,l);

    save.pop();

    如果改变了save, 还需要再变回来。

  • 相关阅读:
    UVa 1354 天平难题 (枚举二叉树)
    广西邀请赛总结
    UVa 12118 检查员的难题 (dfs判连通, 构造欧拉通路)
    UVA
    Uva 127 "Accordian" Patience (模拟)
    UVA 10539 Almost Prime Numbers( 素数因子)
    HDU 1272 小希的迷宫(并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 2236 Wireless Network(并查集)
    HDU 1233 还是畅通工程 ( Kruskal或Prim)
  • 原文地址:https://www.cnblogs.com/fanhaha/p/7286056.html
Copyright © 2011-2022 走看看