个人主页:[PingdiGuo_guo]
收录专栏:[C++干货专栏]
大家好,今天我们来学一下C++里的一个知识:字符串翻转。
目录
[输入数据 1](#输入数据 1)
[输出数据 1](#输出数据 1)
[1. 拼接新字符串法](#1. 拼接新字符串法)
[2. 双指针法](#2. 双指针法)
1.题目
单词翻转
描述
给出一个由若干个单词组成的句子,单词之间会有一个空格,请你反转这个句子。
输入描述
一行,包含一个由若干个单词组成的句子,单词总数不超过100,每个单词长度不超过10,仅由小写字母组成。
输出描述
一行字符串,表示反转后的句子。
输入数据 1
wc is dog
输出数据 1
cpp
god si cw
提示
输出时每行末尾的多余空格,不影响答案正确性。
2.解决题目
1.所需知识点
1. 字符串的遍历
2. 字符串的长度获取
3. 字符串的拼接
前三个知识点可参考【C++字符串详解】
4. 双指针法
双指针法,也叫快慢指针法,是一种常用的处理数组或链表的技巧。在C++中,可以使用指针或迭代器来实现双指针法。下面是一个示例代码,展示了如何使用双指针法在数组中查找目标值:
cpp
#include <iostream>
#include <vector>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
int target = 3;
int left = 0; // 左指针
int right = nums.size() - 1; // 右指针
while (left <= right) {
// 找到目标值
if (nums[left] == target || nums[right] == target) {
std::cout << "Target found!" << std::endl;
break;
}
left++; // 左指针向右移动
right--; // 右指针向左移动
}
if (left > right) {
std::cout << "Target not found." << std::endl;
}
return 0;
}
在这个示例中,我们定义了一个包含一些整数的向量nums,并定义了一个目标值target。我们使用两个指针left和right分别指向数组的首尾元素。然后,我们使用一个while循环,不断向中间移动两个指针。如果找到目标值,则输出"Target found!",并跳出循环。如果左指针超过了右指针,说明目标值不在数组中,输出"Target not found."。
这个示例只是演示了双指针法的基本用法,实际应用中可能会有更复杂的问题和处理逻辑。使用双指针法可以有效地提高程序的运行效率。
2.算法分析
字符串翻转是一个常见的编程问题,在C++中有多种方法来解决这个问题。在本文中,我们将讨论两种常用的算法:拼接新字符串法和双指针法。
1. 拼接新字符串法
初始思路是创建一个新的字符串,并从原字符串的最后一个字符开始,逐个将其拼接到新字符串中,直到拼接完成整个原字符串。
算法步骤:
-
创建一个空字符串 reversedStr用于存储翻转后的结果。
-
从原字符串的最后一个字符开始,遍历到第一个字符。
-
每次遍历,将当前字符拼接到 reversedStr字符串的末尾。
-
返回reversedStr字符串作为翻转后的结果。
cpp
#include <iostream>
#include <string>
std::string reverseString(std::string str) {
std::string reversedStr;
for (int i = str.length() - 1; i >= 0; i--) {
reversedStr += str[i];
}
return reversedStr;
}
int main() {
std::string str ;
std::getline(std::cin,str);
std::string reversedStr = reverseString(str);
std::cout <<reversedStr << std::endl;
return 0;
}
该方法的时间复杂度为O(n),其中n为字符串的长度。在循环中,我们通过下标从最后一个字符开始遍历原字符串,并使用操作符+=将字符拼接到新字符串中。这种方法的缺点是需要额外的空间来存储新字符串,并且每次拼接字符都会导致内存重新分配,效率较低。
2. 双指针法
改进思路是使用双指针法来减少时间复杂度。具体思路是使用两个指针,一个指向字符串的开头,另一个指向字符串的末尾,不断交换两个指针指向的字符,直到两个指针相遇。
算法步骤:
-
创建一个与原字符串相同的字符串 reversedStr作为结果字符串。
-
使用两个指针 left 和 right,分别指向字符串的开头和末尾。
-
循环交换 left 和 right 指向的字符,然后 left 向右移动一位, right 向左移动一位,直到 left 和 right 相遇。
-
返回 reversedStr 字符串作为翻转后的结果。
cpp
#include <iostream>
#include <string>
std::string reverseString(std::string str) {
std::string reversedStr = str;
int left = 0;
int right = str.length() - 1;
while (left < right) {
std::swap(reversedStr[left], reversedStr[right]);
left++;
right--;
}
return reversedStr;
}
int main() {
std::string str ;
std::getline(std::cin,str);
std::string reversedStr = reverseString(str);
std::cout << reversedStr << std::endl;
return 0;
}
该方法的时间复杂度为O(n/2),也就是O(n),其中n为字符串的长度。通过原地交换字符的方式,避免了额外的空间开销,同时减少了字符串操作的次数,提高了算法的效率,同时,代码简洁度也获得了提高。
3.用处
字符串翻转在C++中有许多实际应用,下面列举了几个常见的用途:
1. 判断回文字符串:字符串翻转可以用于判断一个字符串是否为回文字符串。回文字符串是指正读和反读都相同的字符串,比如"level"和"radar"。可以将字符串翻转后与原来的字符串进行比较,如果相同则是回文字符串。
2. 字符串反转:有时候需要将字符串的字符顺序反转。比如将字符串"hello"翻转为"olleh"。可以使用字符串翻转算法将字符串的字符顺序反转。
3. 字符串拼接或反转拼接:字符串翻转可以与字符串拼接操作结合使用,以实现一些特定的功能。比如将两个字符串拼接在一起,可以先将其中一个字符串进行翻转,然后再进行拼接。
4. 字符串匹配:字符串翻转也可以用于字符串匹配算法中。一些字符串匹配算法,如KMP算法,可以使用字符串翻转来加快匹配的效率。
总之,字符串翻转在C++中有很多实际应用,能够处理字符串相关的问题。在实际编程中,根据具体需求选择合适的字符串翻转方法,可以提高程序的效率和逻辑清晰度。
4.练习
判断一个字符串是否为回文字符串
解决方案 :可以先将字符串进行反转,然后与原字符串进行比较,如果相同则是回文字符串。
cpp
#include <iostream>
#include <string>
bool isPalindrome(const std::string& s) {
std::string reversed = reverseString(s);
return s == reversed;
}
int main() {
std::string s ;
std::getline(std::cin,s);
bool isPalin = isPalindrome(s);
std::cout << isPalin << std::endl; // 输出 1 (true)
return 0;
}
5.总结
本文对C++中的字符串翻转算法进行了解析,了解了字符串的遍历、长度获取、拼接等操作,以及掌握双指针法的使用,对解决字符串翻转问题很有帮助。本篇博客到此就结束了,感谢大家的支持与观看,如果有好的建议欢迎留言喔,谢谢大家啦!