示例:输入字符串为“我非常喜欢这个程序”。函数应该将字符串改为“非常像我这样编程”
null
例子 :
输入 :s=“极客问答练习代码” 输出 :s=“代码实践测试极客”
输入 :s=“擅长编码需要大量练习” 输出 :s=“大量实践需要在良好的获取中编码”
算法 :
- 最初,将给定字符串中的单个单词逐个反转,对于上述示例,在反转单个单词后,字符串应为“i ekil siht margorp yrev hcum”。
- 把整根绳子倒过来 在上面的例子中,从头到尾都是“非常像我这样编程”以获得所需的输出。
以下是上述方法的实施情况:
C++
// C++ program to reverse a string #include <bits/stdc++.h> using namespace std; // Function to reverse words*/ void reverseWords(string s) { // temporary vector to store all words vector<string> 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 <stdio.h> // 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 == ' ' ) { 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
<script> // Javascript program to // reverse a String // Reverse the letters // of the word function reverse(str,start,end) { // Temporary variable // to store character let 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 function reverseWords(s) { // Reversing individual words as // explained in the first step s=s.split( "" ); let start = 0; for (let 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.join( "" ); } // Driver Code var s = "i like this program very much " ; document.write(reverseWords(s)); // This code is contributed by avanitrachhadiya2155 </script> |
输出
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) == ' ' ))) { 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) == ' ' ))) { 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 <bits/stdc++.h> 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:" ); Console.Write(ans.Substring(0, ans.Length - 1)); } } |
Javascript
<script> // JavaScript program to reverse a string var s= [ "i" , "like" , "this" , "program" , "very" , "much" ]; var ans = "" ; for ( var i = 5; i >= 0; i--) { ans += s[i] + " " ; } document.write( "Reversed String:" + "<br>" ); document.write(ans.slice(0,ans.length-1)); </script> |
输出:
Reversed String:much very program this like i
时间复杂性: O(n)
在不使用任何额外空间的情况下: 上述任务也可以通过拆分和直接交换从中间开始的字符串来完成。由于涉及直接交换,占用的空间也更少。
以下是上述方法的实施情况:
C++
// C++ code to reverse a string #include <bits/stdc++.h> 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
<script> // Javascript code to reverse a string // Reverse the string function RevString(s, l) { // Check if number of words is even if (l % 2 == 0) { // Find the middle word let j = parseInt(l / 2, 10); // Starting from the middle // start swapping words at // jth position and l-1-j position while (j <= l - 1) { let 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 let j = parseInt((l / 2), 10) + 1; // Starting from the middle start // swapping the words at jth // position and l-1-j position while (j <= l - 1) { let temp; temp = s[l - j - 1]; s[l - j - 1] = s[j]; s[j] = temp; j += 1; } } let S = s[0]; // Return the reversed sentence for (let i = 1; i < 9; i++) { S = S + " " + s[i]; } return S; } // Driver code let s = "getting good at coding " "needs a lot of practice" ; let words = [ "getting" , "good" , "at" , "coding" , "needs" , "a" , "lot" , "of" , "practice" ]; document.write(RevString(words, 9)); // This code is contributed by suresh07 </script> |
输出
practice of lot a needs coding at good getting
另一个直观的常数空间解 :浏览字符串并镜像字符串中的每个单词,然后在末尾镜像整个字符串。
下面的C++代码可以处理多个相邻空间。
C++
#include <algorithm> #include <iostream> #include <string> 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
如果您在上述代码/算法中发现任何错误,请写评论,或者找到其他方法来解决相同的问题。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END