Abreviaturas alfanuméricas de una string

Dada una string de caracteres de longitud inferior a 10. Necesitamos imprimir todas las abreviaturas alfanuméricas de la string. La abreviatura alfanumérica tiene la forma de caracteres mezclados con los dígitos que es igual al número de caracteres omitidos de una substring seleccionada. 

Por lo tanto, cada vez que se omite una substring de caracteres, debe reemplazarla con el dígito que indica el número de caracteres en la substring. Puede haber cualquier número de substrings omitidas de una string. No deben haber dos substrings adyacentes entre sí. Por lo tanto, no hay dos dígitos adyacentes en el resultado. Para una idea más clara, vea el ejemplo. 

Ejemplos:

Input : ANKS 
Output :
ANKS (nothing is replaced)
ANK1 (S is replaced) 
AN1S (K is replaced)
AN2  (KS is replaced)
A1KS (N is replaced)
A1K1 (N and S are replaced)
A2S (NK is replaced)
A3 (NKS is replaced)
1NKS (A is replaced)
1NK1 (A and S are replaced)
1N1S (A and N is replaced)
1N2 (A and KS are replaced)
2KS (AN is replaced)
2K1 (AN and S is replaced)
3S (ANK is replaced)
4 (ANKS is replaced)

Input : ABC
Output : 
ABC
AB1 
A1C 
A2 
1BC 
1B1 
2C 
3
Note: 11C is not valid because no two digits should be adjacent, 
2C is the correct one because AB is a substring, not A and B individually

Fuente: pregunta de la entrevista de Google 

La idea es comenzar con una string vacía. En cada paso, tenemos dos opciones.

  1. Considera el carácter tal como es.
  2. Añadir carácter para contar. Si no hay conteo, entonces use 1.

COULD NOT LOAD IMAGE

Puede ver cómo cada carácter puede sumarse al resultado como un carácter o como un dígito. Esto además da lugar a 2^n abreviaturas al final, donde n es la longitud de la string. 

Implementación:

CPP

// C++ program to print all Alpha-Numeric Abbreviations
// of a String
#include <bits/stdc++.h>
using namespace std;
  
// Recursive function to print the valid combinations
// s is string, st is resultant string
void printCompRec(const string& s, int index,
                int max_index, string st)
{
    // if the end of the string is reached
    if (index == max_index) {
        cout << st << "\n";
        return;
    }
  
    // push the current character to result
    st.push_back(s[index]);
  
    // recur for the next [Using Char]
    printCompRec(s, index + 1, max_index, st);
  
    // remove the character from result
    st.pop_back();
  
    // set count of digits to 1
    int count = 1;
  
    // addition the adjacent digits
    if (!st.empty()) {
  
        if (isdigit(st.back())) {
  
            // get the digit and increase the count
            count += (int)(st.back() - '0');
  
            // remove the adjacent digit
            st.pop_back();
        }
    }
  
    // change count to a character
    char to_print = (char)(count + '0');
  
    // add the character to result
    st.push_back(to_print);
  
    // recur for this again [Using Count]
    printCompRec(s, index + 1, max_index, st);
}
  
// Wrapper function
void printComb(std::string s)
{
    // if the string is empty
    if (!s.length())
        return;
  
    // Stores result strings one by one
    string st;
  
    printCompRec(s, 0, s.length(), st);
}
  
// driver function
int main()
{
    string str = "GFG";
    printComb(str);
    return 0;
}

Python3

# Python program to print all Alpha-Numeric Abbreviations
# of a String
  
# Recursive function to print the valid combinations
# s is string, st is resultant string
def printCompRec(s, index, max_index, st):
  
    # if the end of the string is reached
    if (index == max_index):
        print(st)
        return
  
    # push the current character to result
    st += s[index]
  
    # recur for the next [Using Char]
    printCompRec(s, index + 1, max_index, st)
  
    # remove the character from result
    st = st[0:len(st)-1]
  
    # set count of digits to 1
    count = 1
  
    # addition the adjacent digits
    if (len(st) > 0):
  
        if (ord(st[-1])>=ord('0') and ord(st[-1])<=ord('9')):
  
            # get the digit and increase the count
            count += (ord(st[-1]) - ord('0'))
  
            # remove the adjacent digit
            st = st[0:len(st)-1]
  
    # change count to a character
    to_print = chr(count + ord('0'))
  
    # add the character to result
    st += to_print
  
    # recur for this again [Using Count]
    printCompRec(s, index + 1, max_index, st)
  
  
# Wrapper function
def printComb(s):
  
    # if the string is empty
    if (len(s) == 0):
        return
  
    # Stores result strings one by one
    st = ""
  
    printCompRec(s, 0, len(s), st)
  
# driver function
Str = "GFG"
printComb(Str)
  
# This code is contributed by shinjanpatra

Javascript

<script>
  
// JavaScript program to print all Alpha-Numeric Abbreviations
// of a String
  
// Recursive function to print the valid combinations
// s is string, st is resultant string
function printCompRec(s, index, max_index, st){
  
    // if the end of the string is reached
    if (index == max_index){
        document.write(st,"</br>")
        return
    }
  
    // push the current character to result
    st += s[index]
  
    // recur for the next [Using Char]
    printCompRec(s, index + 1, max_index, st)
  
    // remove the character from result
    st = st.substring(0,st.length-1)
  
    // set count of digits to 1
    let count = 1
  
    // addition the adjacent digits
    if (st.length > 0){
  
        if (st.charCodeAt(st.length-1)>='0'.charCodeAt(0) && st.charCodeAt(st.length-1)<='9'.charCodeAt(0)){
  
            // get the digit and increase the count
            count += (st.charCodeAt(st.length-1) - '0'.charCodeAt(0))
  
            // remove the adjacent digit
            st = st.substring(0,st.length-1)
        }
    }
  
    // change count to a character
    let to_print = String.fromCharCode(count + '0'.charCodeAt(0))
  
    // add the character to result
    st += to_print
  
    // recur for this again [Using Count]
    printCompRec(s, index + 1, max_index, st)
}
  
// Wrapper function
function printComb(s){
  
    // if the string is empty
    if (s.length == 0)
        return
  
    // Stores result strings one by one
    let st = ""
  
    printCompRec(s, 0, s.length, st)
}
  
// driver function
let Str = "GFG"
printComb(Str)
  
// This code is contributed by shinjanpatra
  
</script>
Producción

GFG
GF1
G1G
G2
1FG
1F1
2G
3

Podemos generar todas estas abreviaturas iterativamente también

Algoritmo:
1. Deje que la string de longitud n = 3, str = valor binario «ABC»
entre 0 y 7 ayudará a decidir qué carácter se usará o qué carácter se reemplazará
Si, por ejemplo, n = 6, binario = 110
considere cada posición de bit binario como bit de índice
= 1 significa que será reemplazado y 0 significa que no estamos cambiando ese carácter de índice y 0 significa que permanecerá como está

Implementación:

Java

import java.io.*;
import java.util.*;
  
public class Main {
  
    private static void printans(String str)
    {
        String ans = "";
        int counter = 0;
        for (char ch : str.toCharArray()) {
            if (ch == '-') {
                counter++;
            }
            else {
                if (counter > 0)
                    ans = ans + counter;
                counter = 0;
                ans = ans + ch;
            }
        }
        if (counter > 0)
            ans = ans + counter;
        System.out.println(ans);
    }
  
    public static void main(String[] args)
    {
  
        String str = "ANKS";
  
        int n = str.length();
        int limit = 1 << n;
        for (int i = 0; i < limit; i++) {
            int counter = i, idx = 0;
            String abb = "";
            for (int b = 0; b < n; b++) {
                int bit = counter % 2;
                counter /= 2;
                if (bit == 1) {
                    abb = abb + "-";
                }
                else {
                    abb = abb + str.charAt(idx);
                }
                idx++;
            }
            printans(abb);
        }
    }
}
Producción

ANKS
1NKS
A1KS
2KS
AN1S
1N1S
A2S
3S
ANK1
1NK1
A1K1
2K1
AN2
1N2
A3
4

Este artículo es una contribución de Aditya Nihal Kumar Singh . 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 *