电话号码的字母组合

时间:2016-09-16 12:02:06

标签: c++ backtracking

给定一个数字字符串,我们需要打印数字代表的所有字母组合

对于输入“23”,输出应为[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]。

    class Solution {
public:
     char ph[10][4]={{'0','0','0','0',},{'0','0','0','0',},{'a','b','c','0'},{'d','e','f','0'},{'g','h','i','0'},{'j','k','l','0'},{'m','n','o','0'},{'p','q','r','s'},{'t','u','v','0'},{'w','x','y','z'}};
     vector<string> ans;
     void print(string digits,string st,int pos)
     {
         int i,l=digits.size();
         if(l==pos)
            {
                ans.push_back(st);
                return;
            }
        else
        {
            for(i=pos;i<l;i++)
            {
                int ch=digits[i]-'0';
                for(int j=0;j<4 && ph[ch][j]!='0';j++)
                {
                    print(digits,st+ph[ch][j],i+1);
                }
            }

        }
     }
    vector<string> letterCombinations(string digits) {
        int l=digits.size();
        if(!l)
            return ans;
        print(digits,"",0);
        return ans;
    }
};

但输入“22”时出现错误,另外打印'a','b',c'。代码有什么问题?

1 个答案:

答案 0 :(得分:1)

问题是你们都在循环和递归。

print("22", "", 0);

将进入

print("22", "a", 1);
print("22", "b", 1);
print("22", "c", 1);
print("22", "a", 2);
print("22", "b", 2);
print("22", "c", 2);

你的额外位是最后三次调用。

摆脱输入数字的循环(你已经通过递归执行了这一步):

 void print(string digits, string st, int pos)
 {
     if(digits.size() == pos)
     {
         ans.push_back(st);
     }
     else
     {
         int ch = digits[pos] - '0';
         for(int j = 0; j < 4 && ph[ch][j] != '0'; j++)
         {
             print(digits, st + ph[ch][j], pos + 1);
         }
     }
 }

(你也忘了终止你的一些阵列,但这是一个不同的问题。)