📌  相关文章
📜  反转给定字符串中的单词

📅  最后修改于: 2022-05-13 01:57:08.159000             🧑  作者: Mango

反转给定字符串中的单词

示例:让输入字符串为“我非常喜欢这个程序”。该函数应将字符串更改为“much very program this like i”

反话

例子

算法

  • 最初,将给定字符串的单个单词逐个反转,对于上面的示例,在反转单个单词之后,字符串应该是“i ekil siht margorp yrev hcum”。
  • 在上面的示例中,从头到尾反转整个字符串以获得所需的输出“much very program this like i”。

下面是上述方法的实现:

C++
// C++ program to reverse a string
#include 
using namespace std;
 
// Function to reverse words*/
void reverseWords(string s)
{
     
    // temporary vector to store all words
    vector tmp;
    string str = "";
    for (int i = 0; i < s.length(); i++)
    {
         
        // Check if we encounter space
        // push word(str) to vector
        // and make str NULL
        if (s[i] == ' ')
        {
            tmp.push_back(str);
            str = "";
        }
 
        // Else add character to
        // str to form current word
        else
            str += s[i];
    }
   
    // Last word remaining,add it to vector
    tmp.push_back(str);
 
    // Now print from last to first in vector
    int i;
    for (i = tmp.size() - 1; i > 0; i--)
        cout << tmp[i] << " ";
    // Last word remaining,print it
    cout << tmp[0] << endl;
}
 
// Driver Code
int main()
{
    string s = "i like this program very much";
    reverseWords(s);
    return 0;
}


C
// C program to reverse a string
#include 
 
// Function to reverse any sequence
// starting with pointer begin and
// ending with pointer end
void reverse(char* begin, char* end)
{
    char temp;
    while (begin < end) {
        temp = *begin;
        *begin++ = *end;
        *end-- = temp;
    }
}
 
// Function to reverse words*/
void reverseWords(char* s)
{
    char* word_begin = s;
 
    // Word boundary
    char* temp = s;
 
    // Reversing individual words as
    // explained in the first step
    while (*temp) {
        temp++;
        if (*temp == '\0') {
            reverse(word_begin, temp - 1);
        }
        else if (*temp == ' ') {
            reverse(word_begin, temp - 1);
            word_begin = temp + 1;
        }
    }
 
    // Reverse the entire string
    reverse(s, temp - 1);
}
 
// Driver Code
int main()
{
    char s[] = "i like this program very much";
    char* temp = s;
    reverseWords(s);
    printf("%s", s);
    return 0;
}


Java
// Java program to
// reverse a String
import java.util.*;
class GFG{
 
// Reverse the letters
// of the word
static void reverse(char str[],
                    int start,
                    int end)
{
  // Temporary variable
  // to store character
  char temp;
   
  while (start <= end)
  {
    // Swapping the first
    // and last character
    temp = str[start];
    str[start] = str[end];
    str[end] = temp;
    start++;
    end--;
  }
}
// Function to reverse words
static char[] reverseWords(char []s)
{
  // Reversing individual words as
  // explained in the first step
 
  int start = 0;
  for (int end = 0; end < s.length; end++)
  {
    // If we see a space, we
    // reverse the previous
    // word (word between
    // the indexes start and end-1
    // i.e., s[start..end-1]
    if (s[end] == ' ')
    {
      reverse(s, start, end);
      start = end + 1;
    }
  }
 
  // Reverse the last word
  reverse(s, start, s.length - 1);
 
  // Reverse the entire String
  reverse(s, 0, s.length - 1);
  return s;
}
 
// Driver Code
public static void main(String[] args)
{
  String s = "i like this program very much ";
  char []p = reverseWords(s.toCharArray());
  System.out.print(p);
}
}
 
// This code is contributed by gauravrajput1


Python3
# Python3 program to reverse a string
 
# Function to reverse each word in the string
def reverse_word(s, start, end):
    while start < end:
        s[start], s[end] = s[end], s[start]
        start = start + 1
        end -= 1
 
 
s = "i like this program very much"
 
# Convert string to list to use it as a char array
s = list(s)
start = 0
while True:
     
    # We use a try catch block because for
    # the last word the list.index() function
    # returns a ValueError as it cannot find
    # a space in the list
    try:
        # Find the next space
        end = s.index(' ', start)
 
        # Call reverse_word function
        # to reverse each word
        reverse_word(s, start, end - 1)
 
        #Update start variable
        start = end + 1
 
    except ValueError:
 
        # Reverse the last word
        reverse_word(s, start, len(s) - 1)
        break
 
# Reverse the entire list
s.reverse()
 
# Convert the list back to
# string using string.join() function
s = "".join(s)
 
print(s)
 
# Solution contributed by Prem Nagdeo


C#
// C# program to
// reverse a String
using System;
 
class GFG
{
 
// Reverse the letters
// of the word
static void reverse(char []str,
                    int start,
                    int end)
{
   
  // Temporary variable
  // to store character
  char temp;
   
  while (start <= end)
  {
     
    // Swapping the first
    // and last character
    temp = str[start];
    str[start] = str[end];
    str[end] = temp;
    start++;
    end--;
  }
}
   
// Function to reverse words
static char[] reverseWords(char []s)
{
   
  // Reversing individual words as
  // explained in the first step
 
  int start = 0;
  for (int end = 0; end < s.Length; end++)
  {
     
    // If we see a space, we
    // reverse the previous
    // word (word between
    // the indexes start and end-1
    // i.e., s[start..end-1]
    if (s[end] == ' ')
    {
      reverse(s, start, end);
      start = end + 1;
    }
  }
 
  // Reverse the last word
  reverse(s, start, s.Length - 1);
 
  // Reverse the entire String
  reverse(s, 0, s.Length - 1);
  return s;
}
 
// Driver Code
public static void Main(String[] args)
{
  String s = "i like this program very much ";
  char []p = reverseWords(s.ToCharArray());
  Console.Write(p);
}
}
 
// This code is contributed by jana_sayantan


Javascript


C++
// C++ program for above approach:
void reverseWords(char* s)
{
  char* word_begin = NULL;
 
  //  /* temp is for word boundary */
  char* temp = s;
 
  /*STEP 1 of the above algorithm */
  while (*temp)
  {
 
    /*This condition is to make sure that the
          string start with valid character (not
          space) only*/
    if ((word_begin == NULL) &&
        (*temp != ' '))
    {
      word_begin = temp;
    }
    if (word_begin && ((*(temp + 1) == ' ') ||
                       (*(temp + 1) == '\0')))
    {
      reverse(word_begin, temp);
      word_begin = NULL;
    }
    temp++;
  } /* End of while */
 
  /*STEP 2 of the above algorithm */
  reverse(s, temp - 1);
}
 
// This code is contributed by rutvik_56.


C
// C program for above approach:
void reverseWords(char* s)
{
    char* word_begin = NULL;
   
    //  /* temp is for word boundary */
    char* temp = s;
 
    /*STEP 1 of the above algorithm */
    while (*temp)
    {
 
        /*This condition is to make sure that the
          string start with valid character (not
          space) only*/
        if ((word_begin == NULL) &&
                  (*temp != ' '))
        {
            word_begin = temp;
        }
        if (word_begin && ((*(temp + 1) == ' ') ||
            (*(temp + 1) == '\0')))
        {
            reverse(word_begin, temp);
            word_begin = NULL;
        }
        temp++;
    } /* End of while */
 
    /*STEP 2 of the above algorithm */
    reverse(s, temp - 1);
}


C++
// C++ program to reverse a string
// s = input()
#include 
using namespace std;
 
int main()
{
    string s[] = {"i", "like", "this", "program", "very", "much"};
                                         
    string ans = "";
    for (int i = 5; i >= 0; i--)
    {
        ans += s[i] + " ";
    }
    cout << ("Reversed String:") << endl;
    cout << (ans.substr(0, ans.length() - 1)) << endl;
 
    return 0;
}
 
// This code is contributed by divyeshrabadiya07.


Java
// Java program to reverse a string
// s = input()
public class ReverseWords
{
 
    public static void main(String[] args)
    {
        String s[] = "i like this program very much".
                                        split(" ");
        String ans = "";
        for (int i = s.length - 1; i >= 0; i--)
        {
            ans += s[i] + " ";
        }
        System.out.println("Reversed String:");
        System.out.println(ans.substring(0,
                                  ans.length() - 1));
    }
}


Python3
# Python3 program to reverse a string
# s = input()
s = "i like this program very much"
words = s.split(' ')
string =[]
for word in words:
    string.insert(0, word)
 
print("Reversed String:")
print(" ".join(string))
 
# Solution proposed bu Uttam


C#
// C# program to reverse a string
// s = input()
 
using System;
public class ReverseWords
{
 
    public static void Main()
    {
        string[] s = "i like this program very much".
                                         Split(' ');
        string ans = "";
        for (int i = s.Length - 1; i >= 0; i--)
        {
            ans += s[i] + " ";
        }
        Console.Write("Reversed String:\n");
        Console.Write(ans.Substring(0,
                                    ans.Length - 1));
    }
}


Javascript


C++
// C++ code to reverse a string
#include 
using namespace std;
 
// Reverse the string
string RevString(string s[], int l)
{
     
    // Check if number of words is even
    if (l % 2 == 0)
    {
         
        // Find the middle word
        int j = l / 2;
         
        // Starting from the middle
        // start swapping words at
        // jth position and l-1-j position
        while (j <= l - 1)
        {
            string temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Check if number of words is odd
    else
    {
         
        // Find the middle word
        int j = (l / 2) + 1;
         
        // Starting from the middle start
        // swapping the words at jth
        // position and l-1-j position
        while (j <= l - 1)
        {
            string temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    string S = s[0];
     
    // Return the reversed sentence
    for(int i = 1; i < 9; i++)
    {
        S = S + " " + s[i];
    }
    return S;
}
 
// Driver code
int main()
{
    string s = "getting good at coding "
               "needs a lot of practice";
                
    string words[] = { "getting", "good", "at",
                       "coding", "needs", "a",
                       "lot", "of", "practice"};
      
    cout << RevString(words, 9) << endl;
 
    return 0;
}
 
// This code is contributed by divyesh072019


Java
// Java code to reverse a string
class GFG{
     
// Reverse the string
public static String[] RevString(String[] s,
                                 int l)
{
     
    // Check if number of words is even
    if (l % 2 == 0)
    {
         
        // Find the middle word
        int j = l / 2;
         
        // Starting from the middle
        // start swapping words at
        // jth position and l-1-j position
        while (j <= l - 1)
        {
            String temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Check if number of words is odd
    else
    {
         
        // Find the middle word
        int j = (l / 2) + 1;
         
        // Starting from the middle start
        // swapping the words at jth
        // position and l-1-j position
        while (j <= l - 1)
        {
            String temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Return the reversed sentence
    return s;
}
 
// Driver Code
public static void main(String[] args)
{
    String s = "getting good at coding " +
               "needs a lot of practice";
    String[] words = s.split("\\s");
     
    words = RevString(words, words.length);
     
    s = String.join(" ", words);
     
    System.out.println(s);
}
}
 
// This code is contributed by MuskanKalra1


Python3
# Python3 code to reverse a string
 
# Reverse the string
def RevString(s,l):
   
  # Check if number of words is even
  if l%2 == 0:
     
    # Find the middle word
    j = int(l/2)
     
    # Starting from the middle
    # start swapping words
    # at jth position and l-1-j position
    while(j <= l - 1):
      s[j], s[l - j - 1] = s[l - j - 1], s[j]
      j += 1
       
  # Check if number of words is odd
  else:
     
    # Find the middle word
    j = int(l/2 + 1)
     
    # Starting from the middle
    # start swapping the words
    # at jth position and l-1-j position
    while(j <= l - 1):
      s[j], s[l - 1 - j] = s[l - j - 1], s[j]
      j += 1
     
    # return the reversed sentence
    return s;
       
# Driver Code
s = 'getting good at coding needs a lot of practice'
string = s.split(' ')
string = RevString(string,len(string))
print(" ".join(string))


C#
// C# code to reverse a string
using System;
class GFG{
     
// Reverse the string
public static String[] RevString(String[] s, int l)
{
     
    // Check if number of words is even
    if (l % 2 == 0)
    {
         
        // Find the middle word
        int j = l / 2;
         
        // Starting from the middle
        // start swapping words at
        // jth position and l-1-j position
        while (j <= l - 1)
        {
            String temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Check if number of words is odd
    else
    {
         
        // Find the middle word
        int j = (l / 2) + 1;
         
        // Starting from the middle start
        // swapping the words at jth
        // position and l-1-j position
        while (j <= l - 1)
        {
            String temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Return the reversed sentence
    return s;
}
 
// Driver Code
public static void Main(String[] args)
{
    String s = "getting good at coding " +
            "needs a lot of practice";
    String[] words = s.Split("\\s");
     
    words = RevString(words, words.Length);
     
    s = String.Join(" ", words);
     
    Console.WriteLine(s);
}
}
 
// This code is contributed by shivanisinghss2110


Javascript


C++
#include 
#include 
#include 
  
using namespace std;
  
string reverse_words(string s)
{
    int left = 0, i = 0, n = s.size();
    
    while (s[i] == ' ')
        i++;
    
    left = i;
    
    while (i < n)
    {
        if (i + 1 == n || s[i] == ' ')
        {
            int j = i - 1;
            if (i + 1 == n)
                j++;
            
            while (left < j)
                swap(s[left++], s[j--]);
            
            left = i + 1;
        }
        if (s[left] == ' ' && i > left)
            left = i;
        
        i++;
    }
    reverse(s.begin(), s.end());
    return s;
}
  
int main()
{
  
    string str = "Be a game changer the world is already full of players";
  
    str = reverse_words(str);
  
    cout << str;
    
    return 0;
  // This code is contributed
  // by Gatea David
}


输出
much very program this like i

上面的代码不处理字符串以空格开头的情况。以下版本处理了这种特定情况,并且在中间有多个空格的情况下不会对 reverse函数进行不必要的调用。感谢 rka143 提供这个版本。

C++

// C++ program for above approach:
void reverseWords(char* s)
{
  char* word_begin = NULL;
 
  //  /* temp is for word boundary */
  char* temp = s;
 
  /*STEP 1 of the above algorithm */
  while (*temp)
  {
 
    /*This condition is to make sure that the
          string start with valid character (not
          space) only*/
    if ((word_begin == NULL) &&
        (*temp != ' '))
    {
      word_begin = temp;
    }
    if (word_begin && ((*(temp + 1) == ' ') ||
                       (*(temp + 1) == '\0')))
    {
      reverse(word_begin, temp);
      word_begin = NULL;
    }
    temp++;
  } /* End of while */
 
  /*STEP 2 of the above algorithm */
  reverse(s, temp - 1);
}
 
// This code is contributed by rutvik_56.

C

// C program for above approach:
void reverseWords(char* s)
{
    char* word_begin = NULL;
   
    //  /* temp is for word boundary */
    char* temp = s;
 
    /*STEP 1 of the above algorithm */
    while (*temp)
    {
 
        /*This condition is to make sure that the
          string start with valid character (not
          space) only*/
        if ((word_begin == NULL) &&
                  (*temp != ' '))
        {
            word_begin = temp;
        }
        if (word_begin && ((*(temp + 1) == ' ') ||
            (*(temp + 1) == '\0')))
        {
            reverse(word_begin, temp);
            word_begin = NULL;
        }
        temp++;
    } /* End of while */
 
    /*STEP 2 of the above algorithm */
    reverse(s, temp - 1);
}

时间复杂度: O(n)
另一种方法:

我们可以通过以相反的方式拆分和保存字符串来完成上述任务。

下面是上述方法的实现:

C++

// C++ program to reverse a string
// s = input()
#include 
using namespace std;
 
int main()
{
    string s[] = {"i", "like", "this", "program", "very", "much"};
                                         
    string ans = "";
    for (int i = 5; i >= 0; i--)
    {
        ans += s[i] + " ";
    }
    cout << ("Reversed String:") << endl;
    cout << (ans.substr(0, ans.length() - 1)) << endl;
 
    return 0;
}
 
// This code is contributed by divyeshrabadiya07.

Java

// Java program to reverse a string
// s = input()
public class ReverseWords
{
 
    public static void main(String[] args)
    {
        String s[] = "i like this program very much".
                                        split(" ");
        String ans = "";
        for (int i = s.length - 1; i >= 0; i--)
        {
            ans += s[i] + " ";
        }
        System.out.println("Reversed String:");
        System.out.println(ans.substring(0,
                                  ans.length() - 1));
    }
}

Python3

# Python3 program to reverse a string
# s = input()
s = "i like this program very much"
words = s.split(' ')
string =[]
for word in words:
    string.insert(0, word)
 
print("Reversed String:")
print(" ".join(string))
 
# Solution proposed bu Uttam

C#

// C# program to reverse a string
// s = input()
 
using System;
public class ReverseWords
{
 
    public static void Main()
    {
        string[] s = "i like this program very much".
                                         Split(' ');
        string ans = "";
        for (int i = s.Length - 1; i >= 0; i--)
        {
            ans += s[i] + " ";
        }
        Console.Write("Reversed String:\n");
        Console.Write(ans.Substring(0,
                                    ans.Length - 1));
    }
}

Javascript


输出:
Reversed String:
much very program this like i

时间复杂度: O(n)

不使用任何额外空间:
上面的任务也可以通过从中间开始拆分和直接交换字符串来完成。由于涉及直接交换,因此消耗的空间也更少。

下面是上述方法的实现:

C++

// C++ code to reverse a string
#include 
using namespace std;
 
// Reverse the string
string RevString(string s[], int l)
{
     
    // Check if number of words is even
    if (l % 2 == 0)
    {
         
        // Find the middle word
        int j = l / 2;
         
        // Starting from the middle
        // start swapping words at
        // jth position and l-1-j position
        while (j <= l - 1)
        {
            string temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Check if number of words is odd
    else
    {
         
        // Find the middle word
        int j = (l / 2) + 1;
         
        // Starting from the middle start
        // swapping the words at jth
        // position and l-1-j position
        while (j <= l - 1)
        {
            string temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    string S = s[0];
     
    // Return the reversed sentence
    for(int i = 1; i < 9; i++)
    {
        S = S + " " + s[i];
    }
    return S;
}
 
// Driver code
int main()
{
    string s = "getting good at coding "
               "needs a lot of practice";
                
    string words[] = { "getting", "good", "at",
                       "coding", "needs", "a",
                       "lot", "of", "practice"};
      
    cout << RevString(words, 9) << endl;
 
    return 0;
}
 
// This code is contributed by divyesh072019

Java

// Java code to reverse a string
class GFG{
     
// Reverse the string
public static String[] RevString(String[] s,
                                 int l)
{
     
    // Check if number of words is even
    if (l % 2 == 0)
    {
         
        // Find the middle word
        int j = l / 2;
         
        // Starting from the middle
        // start swapping words at
        // jth position and l-1-j position
        while (j <= l - 1)
        {
            String temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Check if number of words is odd
    else
    {
         
        // Find the middle word
        int j = (l / 2) + 1;
         
        // Starting from the middle start
        // swapping the words at jth
        // position and l-1-j position
        while (j <= l - 1)
        {
            String temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Return the reversed sentence
    return s;
}
 
// Driver Code
public static void main(String[] args)
{
    String s = "getting good at coding " +
               "needs a lot of practice";
    String[] words = s.split("\\s");
     
    words = RevString(words, words.length);
     
    s = String.join(" ", words);
     
    System.out.println(s);
}
}
 
// This code is contributed by MuskanKalra1

Python3

# Python3 code to reverse a string
 
# Reverse the string
def RevString(s,l):
   
  # Check if number of words is even
  if l%2 == 0:
     
    # Find the middle word
    j = int(l/2)
     
    # Starting from the middle
    # start swapping words
    # at jth position and l-1-j position
    while(j <= l - 1):
      s[j], s[l - j - 1] = s[l - j - 1], s[j]
      j += 1
       
  # Check if number of words is odd
  else:
     
    # Find the middle word
    j = int(l/2 + 1)
     
    # Starting from the middle
    # start swapping the words
    # at jth position and l-1-j position
    while(j <= l - 1):
      s[j], s[l - 1 - j] = s[l - j - 1], s[j]
      j += 1
     
    # return the reversed sentence
    return s;
       
# Driver Code
s = 'getting good at coding needs a lot of practice'
string = s.split(' ')
string = RevString(string,len(string))
print(" ".join(string))

C#

// C# code to reverse a string
using System;
class GFG{
     
// Reverse the string
public static String[] RevString(String[] s, int l)
{
     
    // Check if number of words is even
    if (l % 2 == 0)
    {
         
        // Find the middle word
        int j = l / 2;
         
        // Starting from the middle
        // start swapping words at
        // jth position and l-1-j position
        while (j <= l - 1)
        {
            String temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Check if number of words is odd
    else
    {
         
        // Find the middle word
        int j = (l / 2) + 1;
         
        // Starting from the middle start
        // swapping the words at jth
        // position and l-1-j position
        while (j <= l - 1)
        {
            String temp;
            temp = s[l - j - 1];
            s[l - j - 1] = s[j];
            s[j] = temp;
            j += 1;
        }
    }
     
    // Return the reversed sentence
    return s;
}
 
// Driver Code
public static void Main(String[] args)
{
    String s = "getting good at coding " +
            "needs a lot of practice";
    String[] words = s.Split("\\s");
     
    words = RevString(words, words.Length);
     
    s = String.Join(" ", words);
     
    Console.WriteLine(s);
}
}
 
// This code is contributed by shivanisinghss2110

Javascript


输出
practice of lot a needs coding at good getting

另一个直观的常量空间解决方案:遍历字符串并镜像字符串中的每个单词,然后在最后镜像整个字符串。

以下 C++ 代码可以处理多个连续空格。

C++

#include 
#include 
#include 
  
using namespace std;
  
string reverse_words(string s)
{
    int left = 0, i = 0, n = s.size();
    
    while (s[i] == ' ')
        i++;
    
    left = i;
    
    while (i < n)
    {
        if (i + 1 == n || s[i] == ' ')
        {
            int j = i - 1;
            if (i + 1 == n)
                j++;
            
            while (left < j)
                swap(s[left++], s[j--]);
            
            left = i + 1;
        }
        if (s[left] == ' ' && i > left)
            left = i;
        
        i++;
    }
    reverse(s.begin(), s.end());
    return s;
}
  
int main()
{
  
    string str = "Be a game changer the world is already full of players";
  
    str = reverse_words(str);
  
    cout << str;
    
    return 0;
  // This code is contributed
  // by Gatea David
}

输出

players of full already is world the changer game a Be