题目:
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.
题意:
给定输入一个字符串,将字符串中的单词一个接一个的反转输出。使用C程序:试着在O(1)空间复杂度中完成。
说明:
1、单词构成?每个单词由不包含空白字符的字母字符序列组成;
2、输入字符串是否开始跟结尾是否有空白字符?有,反转过后的字符串不应该再包含开始跟结尾的空白字符;
3、两个单词中是否存在多个空白字符?反转输出字符串中,两个单词中只需要单个字符串;
思路一:
将整个给定的字符串逆序翻转,之后对每个字符进行轮训,如果不为空,则开始组拼字符为逆序的单词序列,之后将这部分逆序的单词序列翻转为正常单词状态,之后重复以上步骤,最后删除掉空白空间。
代码:12ms
class Solution { public: void reverseWords(string &s) { reverse(s.begin(), s.end()); int storeIndex = 0; //有效字符存储索引下标 for (int i=0; i<s.size(); i++) { if (s[i] != ' ') { //存在字母字符时 if (storeIndex != 0) //第一个单词前不加空白字符,以后每两个单词之间加空白字符 s[storeIndex++] = ' '; int j = i; while (j<s.size() && s[j] != ' ') { //拿到一个完整单词序列 s[storeIndex++] = s[j++]; //组拼字符为逆序单词序列 } reverse(s.begin() + storeIndex - (j-i), s.begin() + storeIndex); //翻转逆序单词序列为正常单词 i = j; //将此时下标i更新到轮训中 } } s.erase(s.begin() + storeIndex, s.end()); //删掉有效字符串之后的空白空间。 } };
思路二:
利用正则表达式,将给定的字符串由一个或者多个空白字符串作为分隔条件分割为多个单词字符串数组,之后从后往前依次组拼字符串即可。
代码:57ms
public class Solution { public String reverseWords(String s) { String[] parts = s.trim().split("\\s+"); //利用正则表达式切割给定字符串 String res = ""; for (int i=parts.length-1; i>0; i--) { //组拼返回字符串 res += parts[i] + " "; } return res + parts[0]; } }
思路三:
轮训整个给定字符串,先减掉字符串前面的空白字符,然后找到每个单词,将每个单词翻转,完成整个字符串轮训之后,将整个字符串再翻转一遍,即可完成单词翻转。思路三与思路一类似,只是先后顺序不一样。
代码:10ms
class Solution { public: void reverseWords(string &s) { int i = 0, j = 0; int l = 0; int len = s.length(); int wordcount = 0; while (true) { while (i<len && s[i] == ' ') i++; //去掉给定字符串前面的空白 if (i == len) break; //到达字符串末尾,则返回 if (wordcount) s[j++] = ' '; //单词刚开始不加空白字符、之后每两个单词之间用单个空白字符隔开 l = j; //记录下单词开始位置 while (i<len && s[i] != ' ') { //存储单词 s[j++] = s[i++]; } reverseword(s, l, j-1); //将单个单词翻转 wordcount++; } s.resize(j); reverseword(s, 0, j-1); //将结果字符串整个翻转 } void reverseword(string &s, int i, int j) { //翻转给定字符串s的i到j部分 while (i < j) { char t = s[i]; s[i++] = s[j]; s[j--] = t; } } };
思路四:
利用空格做分隔,连续的不为空部分为单词,将寻找到的单词依次组拼到字符串前面即可,需要使用库函数。
代码:13ms
class Solution { public: void reverseWords(string &s) { string res; int pos = 0; for (int i=0; i<s.size(); i++) { if (s[i] == ' ') { //找到两个单词之间的分隔空白字符 if (i > pos) res = s.substr(pos, i-pos) + " " + res; pos = i + 1; //用来跳过刚开始连续的空白,以及单词之间多个空白 } else if (i == s.size() - 1) res = s.substr(pos, s.size()-pos) + " " + res; //组拼最后一个单词 } s = res.substr(0, res.size() - 1); } };