2016-09-16 42 views
-5

の組み合わせは、我々はすべての文字の組み合わせを印刷する必要がある番号を入力するためにレター桁の文字列が与えられた電話番号

を表し、「23」、出力は「広告」、「AE」、「AF」[する必要があり、 "bd"、 "be"、 "bf"、 "cd"、 "ce"、 "cf"]。 「」、「B」、C」additionally.Whatは、コードが間違っているプリント

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」、?

+5

このような問題を解決する適切なツールは、デバッガです。スタックオーバーフローを尋ねる前に、コードを一行ずつ進める必要があります。詳しいヘルプは、[小さなプログラムをデバッグする方法(Eric Lippert)](https://ericlippert.com/2014/03/05/how-to-debug-small-programs/)を参照してください。最低限、問題を再現する[最小、完全、および検証可能](http://stackoverflow.com/help/mcve)の例と、その問題を再現するためのデバッガ。 –

+0

今後もあなたのタイトルはどのような形であれ質問には関係していないようです。電話番号は言及されていませんが、電話番号には文字がありません。コードはまったく説明されていないので、誰もそれを解析する前に何をするのかという手がかりはありません。これは質問をする非常に悪い方法です。 –

+0

何も印刷されないときに関数が "print"と呼ばれるのはなぜですか? – molbdnilo

答えて

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); 

に再帰的になり、あなたの余分なビットは、最後の3つの呼び出しです。

は(すでに再帰的で、そのステップをやっている)の入力桁を超えるループを取り除く:

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); 
     } 
    } 
} 

(あなたはまた、あなたの配列の一部を終了するのを忘れて、それは別の問題です。)

関連する問題