数据结构:反转字符串(Reversing a String)
目录
方法一:双指针法
方法二:辅助数组
方法对比总结:
问题定义
给定一个字符串,例如:
char str[] = "hello";
我们的目标是把它反转成:
"olleh"
📌 输入特点:
-
字符串用
char
数组表示(C风格字符串) -
最后一个字符是
'\0'
(空字符),表示字符串结束
(可以参考类似问题:数据结构:数组:反转数组(Reverse the Array)-CSDN博客 )
方法一:双指针法
🧠 思路讲解:双指针对换法
我们从字符串两端出发,交换字符:
-
指针
left
指向开头(索引 0) -
指针
right
指向结尾(索引为length - 1
,排除'\0'
)
逐步交换:
-
str[left] ↔ str[right]
-
然后
left++
,right--
-
重复,直到
left >= right
代码实现
Step 1:计算字符串长度(不包括 '\0'
)
int len = 0;
while (str[len] != '\0') {len++;
}
Step 2:初始化左右指针
int left = 0;
int right = len - 1;
Step 3:循环交换字符
while (left < right) {char temp = str[left];str[left] = str[right];str[right] = temp;left++;right--;
}
完整代码实现
#include <iostream>
using namespace std;void reverseString(char str[]) {// 计算长度int len = 0;while (str[len] != '\0') {len++;}// 双指针交换字符int left = 0;int right = len - 1;while (left < right) {char temp = str[left];str[left] = str[right];str[right] = temp;left++;right--;}
}int main() {char str[] = "hello";cout << "原字符串: " << str << endl;reverseString(str);cout << "反转后: " << str << endl;return 0;
}
示例演示
字符串 "hello"
:
Left | Right | str[left] | str[right] | After swap |
---|---|---|---|---|
0 | 4 | 'h' | 'o' | o e l l h |
1 | 3 | 'e' | 'l' | o l l e h |
2 | 2 | - | - | done |
结果:"olleh"
方法二:辅助数组
我们使用辅助数组,不直接在原数组中改动。
🧠 思路讲解(辅助数组方法)
-
首先求出原字符串长度(不包括
'\0'
); -
创建一个新数组
rev[]
,长度为len + 1
,用于存放反转后的字符串; -
从
str[len - 1]
开始,把字符逐个写入rev[0], rev[1], ..., rev[len - 1]
; -
最后手动加上
rev[len] = '\0'
; -
将
rev
再复制回str
,或者直接用rev
输出。
代码实现
Step 1:求字符串长度
int len = 0;
while (str[len] != '\0') {len++;
}
Step 2:创建新数组,反向拷贝字符
char rev[100]; // 足够大for (int i = 0; i < len; i++) {rev[i] = str[len - 1 - i];
}
Step 3:别忘了加终止符号 '\0'
rev[len] = '\0';
Step 4:把 rev 拷贝回原数组
for (int i = 0; i <= len; i++) {str[i] = rev[i];
}
完整代码如下
#include <iostream>
using namespace std;void reverseString(char str[]) {// Step 1: 求字符串长度int len = 0;while (str[len] != '\0') {len++;}// Step 2: 使用辅助数组从后往前复制char rev[100]; // 假设最多100个字符for (int i = 0; i < len; i++) {rev[i] = str[len - 1 - i];}// Step 3: 添加字符串终止符rev[len] = '\0';// Step 4: 将 rev 拷贝回原数组 strfor (int i = 0; i <= len; i++) {str[i] = rev[i];}
}int main() {char str[] = "hello";cout << "原字符串: " << str << endl;reverseString(str);cout << "反转后: " << str << endl;return 0;
}
方法对比总结:
方法 | 说明 | 时间复杂度 | 空间复杂度 |
---|---|---|---|
方法①:原地交换 | 左右指针交换 | O(n) | O(1) |
方法②:辅助数组 | 用新数组逆序写入 | O(n) | O(n) |