Reverse Words in a String
Given an input string, reverse the string word by word.
For example,
Given s = “the sky is blue
“,
return “blue is sky the
“.Update (2015-02-12):
For C programmers: Try to solve it in-place in O(1) space.Clarification:
- What constitutes a word?
A sequence of non-space characters constitutes a word.- Could the input string contain leading or trailing spaces?
Yes. However, your reversed string should not contain leading or trailing spaces.- How about multiple spaces between two words?
Reduce them to a single space in the reversed string.
Force solution, o(n) time & space complexity. AC
// I need a terminal to mark the end of the input string. // return the original string if it contains only one word // The string can not be longer than 2^32 // How about multiple spaces between words? Reduce them to a single space // Could the input string contains leading or trailing spaces? Yes //o(n) solution, force solution. class Solution { public: void reverseWords(string &s) { //extreme case int length = s.size(); if(length == 0) return ; string outputStr; bool isInWord = false; int start, end; for(int i = s.size() - 1; i >= 0; i--){ char c = s[i]; if(c == ' '){ if(isInWord == false){ continue; } //in word, find the start of word else{ isInWord = false; start = i + 1; appendStr(outputStr, s, start, end); } } else{ if(isInWord == false){ //find the end of word isInWord = true; end = i; } else{ //in the word } } } if(isInWord == true){ appendStr(outputStr, s, 0, end); } s = outputStr; } void appendStr(string& re, string s, int start, int end){ if(re.size() > 0) re.push_back(' '); re.append(s.substr(start, end - start + 1)); } };
O(1) in space, O(n) in time solution
Reverse the word in space. Handle the “index” words carefully.
// I need a terminal to mark the end of the input string. // return the original string if it contains only one word // The string can not be longer than 2^32 // How about multiple spaces between words? Reduce them to a single space // Could the input string contains leading or trailing spaces? Yes //o(1) solution. class Solution { public: void reverseWords(string &s) { int len = s.size(); int proceedLen = 0; int insertIndex = s.size(); while(proceedLen < len){ //find a word bool isInWord = false; int startIndex = -1; int index = 0; while(proceedLen + index < len){ char c = s[index]; if(c == ' '){ if(isInWord == false){ //pass spaces at the head index++; } else{ //find the end of a word thisLength = index - startIndex; break; } } else{ if(isInWord == false){ //find the beginning of a word isInWord = true; startIndex = index; index++; } else{ //still in the word index++; } } } //trailing spaces if(startIndex == -1){ s.erase(0, index); break; } //insert the word at the insertIndex s.insert(insertIndex, s.substr(startIndex, index - startIndex)); //insert a space to seperate words s.insert(insertIndex, " "); //erase the parsed word s.erase(0, index); //update relative indexs proceedLen += index; insertIndex -= index; } //deal with extra inserted space while(s[0] == ' '){ s.erase(0, 1); } } };