String con secuencia aditiva

Dada una string, la tarea es encontrar si contiene una secuencia aditiva o no. Una string contiene una secuencia aditiva si sus dígitos pueden formar una secuencia de números en la que cada número es una suma de los dos números anteriores. Una string válida debe contener al menos tres dígitos para hacer una secuencia aditiva. 

Ejemplos: 

Input : s = “235813”
Output : true
2 + 3 = 5, 3 + 5 = 8, 5 + 8 = 13

Input : s = “199100199”
Output : true
1 + 99 = 100, 99 + 100 = 199

Input : s = “12345678”
Output : false

Este problema se puede resolver de forma recursiva, tenga en cuenta que la cantidad de dígitos en el valor agregado no puede ser menor que los dígitos en cualquiera de sus operandos, por eso haremos un bucle hasta (longitud de la string)/2 para el primer número y (longitud de la string – longitud del primer número)/ 2 para el segundo número para ignorar el resultado no válido. 

Lo siguiente a tener en cuenta es que el primer y segundo número no pueden comenzar con 0, que se verifica en el código a continuación mediante el método isValid. Cuando llamamos recursivamente, verificamos que la suma del primer y segundo número sea exactamente igual al resto de la string. En caso afirmativo, devuelva directamente el resultado; de lo contrario, verifique que la string de suma sea el prefijo del resto de la string o no. En caso afirmativo, llame recursivamente con el segundo número, la string de suma y el resto de la string después de eliminar la string de suma del resto de la string y si la string de suma no es prefijo del resto de la string, entonces no hay solución disponible. 

A continuación se muestra la implementación de C++.

CPP

// C++ program to check whether a string
// makes an additive sequence or not
#include <bits/stdc++.h>
using namespace std;
 
// Checks whether num is valid or not, by
// checking first character and size
bool isValid(string num)
{
    if (num.size() > 1 && num[0] == '0')
        return false;
    return true;
}
 
// returns int value at pos string, if pos is
// out of bound then returns 0
int val(string a, int pos)
{
    if (pos >= a.length())
        return 0;
 
    //  converting character to integer
    return (a[pos] - '0');
}
 
// add two number in string form and return
// result as a string
string addString(string a, string b)
{
    string sum = "";
    int i = a.length() - 1;
    int j = b.length() - 1;
    int carry = 0;
 
    //  loop until both string get processed
    while (i >= 0 || j >= 0)
    {
        int t = val(a, i) + val(b, j) + carry;
        sum += (t % 10 + '0');
        carry = t / 10;
        i--;    j--;
    }
    if (carry)
        sum += (carry + '0');
    reverse(sum.begin(), sum.end());
    return sum;
}
 
//  Recursive method to check c = a + b
bool checkAddition(list<string>& res, string a,
                             string b, string c)
{
    //  both first and second number should be valid
    if (!isValid(a) || !isValid(b))
        return false;
    string sum = addString(a, b);
 
    //  if sum is same as c then direct return
    if (sum == c)
    {
        res.push_back(sum);
        return true;
    }
 
    /*  if sum size is greater than c, then no
        possible sequence further OR if c is not
        prefix of sum string, then no possible
        sequence further  */
    if (c.size() <= sum.size() ||
        sum != c.substr(0, sum.size()))
        return false;
    else
    {
        res.push_back(sum);
         
        //  next recursive call will have b as first
        //  number, sum as second number and string
        //  c as third number after removing prefix
        //  sum string from c
        return checkAddition(res, b, sum,
                             c.substr(sum.size()));
    }
}
 
//  Method returns additive sequence from string as
// a list
list<string> additiveSequence(string num)
{
    list<string> res;
    int l = num.length();
 
    // loop until l/2 only, because if first
    // number is larger,then no possible sequence
    // later
    for (int i = 1; i <= l/2; i++)
    {
        for (int j = 1; j <= (l - i)/2; j++)
        {
            if (checkAddition(res, num.substr(0, i),
                              num.substr(i, j),
                              num.substr(i + j)))
            {
                // adding first and second number at
                // front of result list
                res.push_front(num.substr(i, j));
                res.push_front(num.substr(0, i));
                return res;
            }
        }
    }
 
    // If code execution reaches here, then string
    // doesn't have any additive sequence
    res.clear();
    return res;
}
 
//  Method to print result list
void printResult(list<string> res)
{
    for (auto it = res.begin(); it != res.end(); it++)
        cout << *it << " ";
    cout << endl;
}
 
//  Driver code to test above methods
int main()
{
    string num = "235813";
    list<string> res = additiveSequence(num);
    printResult(res);
 
    num = "199100199";
    res = additiveSequence(num);
    printResult(res);
    return 0;
}
Producción

2 3 5 8 13 
1 99 100 199 

Este artículo es una contribución de Utkarsh Trivedi . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *