翻转单词顺序列
OJ地址:翻转单词顺序列
方法一:单词拆分
首先定义一个存放字符串的vector容器,然后将字符串按空格进行拆分,拆分成一个个单词,将其存放在 vector 容器中,如果遇到空格,也将空格当作一个字符串,存放入容器内,最后将容器中的字符串按照从后往前进行拼接,最后形成了目标字符串
那么我们怎么拆分单词呢?
- 设置一个索引 i ,从头到尾开始遍历字符串,i 指向的是当前正在考察的字符
- 我们观察发现,当下标 i 指向的字符不是空格,但是 i+1 指向的字符是空格,那么表示遍历完一个单词,此时我们就可以把该单词放入vector容器内,继续往后遍历
- 当 i 下标等于字符串长度 - 1 时,表示遍历完成
string ReverseSentence(string str) {
string res = "";
int i = 0;
if(str.length() == 0) //如果字符串为空,返回空字符串
return res;
while(i < str.length() && str[i] == ' ') //找到字符串第一个非空格字符
++i;
if (i == str.length()) //如果字符串全是空格,返回原字符串
return str;
vector<string> s;
while(i < str.length())
{
string tmp = "";
//如果是空格,也把空格放进数组中
while(str[i] == ' ')
{
s.push_back(" ");
i++;
}
//不是空格,表示要遍历一个单词了
while(str[i] != ' ')
{
tmp += str[i];
//当该字符不是空格,但是下一个字符是空格,那么表示该单词结束
if(str[i + 1] == ' ' || i == str.length() - 1)
{
s.push_back(tmp);
i++;
break;
}
//如果下一个字符不是空格,表示这个单词还未结束,继续遍历
else
i++;
}
}
for(int i = s.size() - 1; i >= 0; i--) //将容器中的字符串按照从后往前进行拼接
{
res += s[i];
}
return res;
}
方法二:滑动窗口
【实现思路】
- 我先把字符串整体逆置
- 然后利用滑动窗口控制每个单词的左右边界,将每个单词进行逆置
- 当遍历完整个字符串,那么整个翻转过程也就完成了
void reverse(string &str, int l, int r) //单词翻转
{
string tmp = str;
for(int i = r; i >= l; i--)
str[r - i + l] = tmp[i];
}
string ReverseSentence(string str) {
reverse(str, 0, str.length()-1); //先整体翻转
int i, j; //滑动窗口左右边界
i = j = 0;
while(j < str.length())
{
while(str[j] != ' ' && j < str.length())
{
j++;
}
if(j == str.length())//字符串中没有空格,直接将整个字符串进行翻转
{
reverse(str, i, j-1);
break;
}
if(j - i > 1) //对单个单词不用进行翻转
reverse(str, i, j-1);
i = j+1; //移动滑动窗口
j = i+1;
}
return str;
}