您的位置:首页 > 其它

[LeetCode]Reverse Words in a String

2015-07-24 21:37 351 查看
参考一些资料,分享一个简洁的代码
思路:
i, j分别指向一个单词的 首尾,从s的结尾开始向前遍历,找到一个单词就取出来放在StringBuilder中。
public class Solution {
public String reverseWords(String s) {
StringBuilder builder = new StringBuilder();

int j = s.length();
for (int i = s.length() -1 ; i >= 0; --i){
if (s.charAt(i) == ' '){
j = i;
}else if ( i == 0 || s.charAt(i-1) == ' '){
if (builder.length() != 0){
builder.append(' ');
}
builder.append(s.substring(i, j));
}
}
return builder.toString();
}
}


-----------第一遍的解题思路--------------
解题思路:
1,把首尾的 space都去掉
2,两个指针start和it分别指向word的开始和结束的下一位;
3,isPreWord用于指示前一个char是字母还是 空格(这是为了过滤两个单词中间有多个space的情况)
4,每发现一个新的完整的单词,就插入到ret的开头,接着插入一个 space
5,因为while循环中我们是以space作为发现单词的标志,而语句的结尾没有space,所以在while结束后,我们还有最后一个单词需要insert进去ret
6,最后str = ret;

class Solution {
public:
void reverseWords(string &s) {
strip(s);

string ret;

auto it = s.begin();
auto start = it;
bool isPreWord = false;
while(it != s.end()){
if (*it == ' '){
if (isPreWord){
isPreWord = false;
ret.insert(ret.begin(), start, it);
ret.insert(0, 1, ' ');
}else{
it++;
}
}else{
if (!isPreWord){
isPreWord = true;
start = it;
}
it ++;
}
}
ret.insert(ret.begin(), start, it);

s = ret;
}

void strip(string &s){
lstrip(s);
rstrip(s);
}
void lstrip(string &s){
auto it = s.begin();
while(it != s.end()){
if (*it == ' '){
it = s.erase(it);
}else{
break;
}
}
}
void rstrip(string &s){
auto rit = s.rbegin();
while(rit != s.rend()){
if (*rit == ' '){
rit = string::reverse_iterator(s.erase((++rit).base()));
}else{
break;
}
}
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: