priyansh
priyansh

Reputation: 41

Return all codes - String

Assume that the value of a = 1, b = 2, c = 3, ... , z = 26. You are given a numeric string S. Write a program to return the list of all possible codes that can be generated from the given string.

For most of the cases this code works but it gives wrong output for inputs which have numbers greater than 26. For eg: 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;
}

if i give input 12345, the output is: " abcde awde lcde l" instead of : " abcde awde lcde"

Upvotes: 1

Views: 8407

Answers (2)

priyansh
priyansh

Reputation: 41

i got it fellow members. i did not initialised the size2 variable to zero. also i didn't use >= operator.

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

this is the final code for getCodes function. Thanks everyone :)

Upvotes: 2

javidcf
javidcf

Reputation: 59731

You can do that more simply with something like this:

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

Output:

Codes for 12345
* abcde
* lcde
* awde

Upvotes: 1

Related Questions