返回所有代码-字符串

时间:2019-07-11 12:59:41

标签: c++ recursion

假定a的值= 1,b = 2,c = 3,...,z =26。为您提供了一个数字字符串S。编写一个程序以返回所有可能的代码清单。从给定的字符串生成。

在大多数情况下,此代码有效,但对于数字大于26的输入,它给出错误的输出。例如:12345。

#include <iostream>
#include <string.h>
using namespace std;


using namespace std;
int atoi(char a)
{
    int i=a-'0';
    return i;
}
char itoa(int i)
{
    char c='a'+i-1;
    return c;
}
int getCodes(string input, string output[10000]) {
   if(input.size()==0)
   {
       return 1;
   }
    if(input.size()==1)
    {
        output[0]=output[0]+itoa(atoi(input[0]));
        return 1;
    }
    string result1[10000],result2[10000];
    int size2;

    int size1=getCodes(input.substr(1),result1);
    if(input.size()>1)
    {
        if(atoi(input[0])*10+atoi(input[1])>10&&atoi(input[0])*10+atoi(input[1])<27)
        {
            size2=getCodes(input.substr(2),result2);
        }

    }
    for(int i=0;i<size1;i++)
    {
        output[i]=itoa(atoi(input[0]))+result1[i];
    }
    for(int i=0;i<size2;i++)
    {
        output[i+size1]=itoa(atoi(input[0])*10+atoi(input[1]))+result2[i];
    }
    return size1+size2;
}



int main(){
    string input;
    cin >> input;

    string output[10000];
    int count = getCodes(input, output);
    for(int i = 0; i < count && i < 10000; i++)
        cout << output[i] << endl;
    return 0;
}

如果我输入12345,则输出为: ” abcde 阿德 液晶显示 l“ 代替 : ” abcde 阿德 lcde”

2 个答案:

答案 0 :(得分:1)

您可以使用以下方法更简单地做到这一点:

#include <utility>
#include <string>
#include <vector>
#include <iostream>

using namespace std;

void getCodesRec(unsigned int num, string& current, vector<string>& result)
{
    // First and last chars for the codes
    static constexpr char FIRST_CHAR = 'a';
    static constexpr char LAST_CHAR = 'z';
    if (num == 0)
    {
        // When there is no more number add the code to the results
        result.push_back(current);
    }
    else
    {
        // Add chars to the existing code
        unsigned int next = num;
        unsigned int rem = next % 10;
        unsigned int f = 1;
        // While we have not gone over the max char number
        // (in practice this loop will run twice at most for a-z letters)
        while (next > 0 && rem <= (unsigned int)(LAST_CHAR - FIRST_CHAR) + 1)
        {
            next = next / 10;
            if (rem != 0)  // 0 does not have a replacement
            {
                // Add the corresponding char
                current.insert(0, 1, FIRST_CHAR + char(rem - 1));
                // Recursive call
                getCodesRec(next, current, result);
                // Remove the char
                current.erase(0, 1);
            }
            // Add another number
            f *= 10;
            rem += f * (next % 10);
        }
    }
}

vector<string> getCodes(unsigned int num)
{
    vector<string> result;
    string current;
    getCodesRec(num, current, result);
    return result;
}


int main()
{
    unsigned int num = 12345;
    vector<string> codes = getCodes(12345);
    cout << "Codes for " << num << endl;
    for (string& code : codes)
    {
        cout << "* " << code << endl;
    }
    return 0;
}

输出:

Codes for 12345
* abcde
* lcde
* awde

答案 1 :(得分:0)

我得到了其他成员。我没有将size2变量初始化为零。我也没有使用> =运算符。

int getCodes(string input, string output[10000]) {
   if(input.size()==0)
   {
       output[0]="";
       return 1;
   }
    if(input.size()==1)
    {
        output[0]=itoa(atoi(input[0]));
        return 1;
    }
    string result1[10000],result2[10000];
    int size2=0;

    int size1=getCodes(input.substr(1),result1);
    if(input.size()>1)
    {
        if(atoi(input[0])*10+atoi(input[1])>=10&&atoi(input[0])*10+atoi(input[1])<27)
        {
            size2=getCodes(input.substr(2),result2);
        }

    }
    int k=0;
    for(int i=0;i<size1;i++)
    {
            output[k++]=itoa(atoi(input[0]))+result1[i];
    }
    for(int i=0;i<size2;i++)
    {
            output[k++]=itoa(atoi(input[0])*10+atoi(input[1]))+result2[i];
    }
    return k;
}

这是getCodes函数的最终代码。谢谢大家:)