53 翻转字符串
原题网址:http://www.lintcode.com/zh-cn/problem/reverse-words-in-a-string/
给定一个字符串,逐个翻转字符串中的每个单词。
说明
- 单词的构成:无空格字母构成一个单词
- 输入字符串是否包括前导或者尾随空格?可以包括,但是反转后的字符不能包括
- 如何处理两个单词间的多个空格?在反转字符串中间空格减少到只含一个
样例
给出s = "the sky is blue",返回"blue is sky the"
方法一:
1 class Solution { 2 public: 3 /* 4 * @param s: A string 5 * @return: A string 6 */ 7 string reverseWords(string &s) { 8 // write your code here 9 if (s.empty()) 10 { 11 return s; 12 } 13 int size=s.size(); 14 string word,line; 15 line.resize(0); 16 int begin=size-1,end=size-1; 17 int i=size-1; 18 19 while(i>=0) //从后向前寻找单词; 20 { 21 while(i>=0&&s[i]==' ') //遇到空格跳过; 22 { 23 begin--; 24 end--; 25 i--; 26 } 27 while(i>=0&&s[i]!=' ') //遇到非空格字符,i与begin前移; 28 { 29 begin--; 30 i--; 31 } 32 word.resize(0); 33 for (int j=begin+1;j<=end;j++) //注意索引范围; 34 { 35 word.append(1,s[j]); 36 } 37 38 39 line=line+word+" "; //注意最后+的空格应是字符串格式; 40 end=begin; 41 } 42 //尾部空格处理; 44 while(line.size()!=0) 45 { 46 if (line[line.size()-1]==' ') 47 { 48 line.erase(line.size()-1,1); 49 } 50 else 51 { 52 break; 53 } 54 } 55 56 return line; 57 } 58 };
方法二:
1 class Solution { 2 public: 3 /* 4 * @param s: A string 5 * @return: A string 6 */ 7 string reverseWords(string &s) { 8 // write your code here 9 if (s.empty()) 10 { 11 return s; 12 } 13 int size=s.size(); 14 reverse(s.begin(),s.end()); //翻转整个字符串; 15 int index=0; //新字符串索引; 16 for (int i=0;i<size;i++)//遍历,逐个翻转单词; 17 { 18 if (s[i]!=' ') 19 { 20 if (index!=0)//index不为0,说明遍历到的不是第一个单词,要在该单词前加空格; 21 { 22 s[index++]=' '; 23 } 24 int j=i; 25 while(j<size&&s[j]!=' ') 26 { 27 s[index++]=s[j++]; 28 } 29 reverse(s.begin()+index-(j-i),s.begin()+index);//翻转新获得的单词; 30 i=j; //避免重复遍历,继续向下循环(应注意此时的s[j]为空格或者超出范围); 31 } 32 } 33 s.resize(index);//实际上新串有效索引到index-1; 34 return s; 35 } 36 };
参考:
6 https://blog.csdn.net/zwy1258432405/article/details/77416101 第二种方法未消除尾部空格