Invertir el orden de las palabras en una cadena.

Resuelto asked hace 15 años • 48 respuestas

Tengo esto string s1 = "My name is X Y Z"y quiero invertir el orden de las palabras para que s1 = "Z Y X is name My".

Puedo hacerlo usando una matriz adicional. Lo pensé mucho, pero ¿es posible hacerlo in situ (sin utilizar estructuras de datos adicionales) y con una complejidad de tiempo O (n)?

 avatar Jun 18 '09 02:06
Aceptado

Invierta toda la cadena, luego invierta las letras de cada palabra individual.

Después del primer paso la cuerda será

s1 = "Z Y X si eman yM"

y después del segundo pase será

s1 = "Z Y X is name My"
 avatar Jun 17 '2009 19:06

invierte la cadena y luego, en una segunda pasada, invierte cada palabra...

en c#, completamente in situ sin matrices adicionales:

static char[] ReverseAllWords(char[] in_text)
{
    int lindex = 0;
    int rindex = in_text.Length - 1;
    if (rindex > 1)
    {
        //reverse complete phrase
        in_text = ReverseString(in_text, 0, rindex);

        //reverse each word in resultant reversed phrase
        for (rindex = 0; rindex <= in_text.Length; rindex++)
        {
            if (rindex == in_text.Length || in_text[rindex] == ' ')
            {
                in_text = ReverseString(in_text, lindex, rindex - 1);
                lindex = rindex + 1;
            }
        }
    }
    return in_text;
}

static char[] ReverseString(char[] intext, int lindex, int rindex)
{
    char tempc;
    while (lindex < rindex)
    {
        tempc = intext[lindex];
        intext[lindex++] = intext[rindex];
        intext[rindex--] = tempc;
    }
    return intext;
}
 avatar Jun 17 '2009 20:06

En Smalltalk:

'These pretzels are making me thirsty' subStrings reduce: [:a :b| b, ' ', a]

Sé que a nadie le importa Smalltalk, pero para mí es muy bonito.

 avatar Apr 17 '2011 18:04