博客主页:倔强的石头的CSDN主页
Gitee主页:倔强的石头的gitee主页
⏩ 文章专栏:C++经典例题
期待您的关注
目录
问题描述
基于快慢指针的解法
基于索引的解法
两种方法的比较
在处理字符串相关的问题时,反转字符串中每个单词的字符顺序是一个常见的任务,同时要保证空格和单词的初始顺序不变。
给定一个字符串 s
,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
s
包含可打印的 ASCII 字符。s
不包含任何开头或结尾空格。s
里 至少 有一个词。s
中的所有单词都用一个空格隔开。原题链接:557. 反转字符串中的单词 III - 力扣(LeetCode)
下面我们将详细介绍两种解决该问题的方法,包括其解题思路和具体实现细节。
1. 解题思路
快慢指针是一种常用的技巧,在本题中,快指针用于遍历字符串,慢指针用于标记每个单词的起始位置。当快指针遇到空格时,就表示一个单词已经遍历完,此时可以对慢指针到快指针之间的字符进行反转。
遍历完整个字符串后,还需要对最后一个单词进行反转,因为最后一个单词后面没有空格来触发反转操作。同时,这也对只要一个单词的情况进行了处理
2. 代码实现
class Solution {
public:
string reverseWords(string s) //快慢指针解法
{
string::iterator fast = s.begin();
string::iterator slow = s.begin();
while( fast != s.end() )//快指针走完就结束
{
if(*fast==' ') //快指针走到空格位置停下,反转该部分字母
{
reverse(slow,fast);
slow = fast+1;
}
++fast;
}
reverse(slow,fast);//出循环时,慢指针留在最后一个单词的第一个字母
//快指针在\0位置,还需要反转一次
//同时可以对只要一个单词的string处理
return s;
}
};
3. 代码细节分析
1. 解题思路
这种方法使用索引来遍历字符串,通过一个变量记录每个单词的起始位置,当遇到空格或者字符串结束时,对当前单词进行反转。
2. 代码实现
#include
#include
#include
class Solution {
public:
string reverseWords(string s) {
int start = 0; // 慢指针,标记每个单词的起始位置
for (int end = 0; end <= s.length(); ++end) {
// 当遇到空格或者字符串结束时,反转当前单词
if (end == s.length() || s[end] == ' ') {
// 反转从 start 到 end - 1 的字符
std::reverse(s.begin() + start, s.begin() + end);
// 更新慢指针到下一个单词的起始位置
start = end + 1;
}
}
return s;
}
};
3. 代码细节分析
通过以上两种方法的详细介绍,我们可以根据具体的需求和个人习惯选择合适的方法来解决反转字符串中单词字符顺序的问题。