C++中的字符串翻转算法解析

个人主页:[PingdiGuo_guo]

收录专栏:[C++干货专栏]

大家好,今天我们来学一下C++里的一个知识:字符串翻转。

目录

1.题目

描述

输入描述

输出描述

[输入数据 1](#输入数据 1)

[输出数据 1](#输出数据 1)

提示

2.解决题目

1.所需知识点

2.算法分析

[1. 拼接新字符串法](#1. 拼接新字符串法)

[2. 双指针法](#2. 双指针法)

3.用处

4.练习

5.总结


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++中的字符串翻转算法进行了解析,了解了字符串的遍历、长度获取、拼接等操作,以及掌握双指针法的使用,对解决字符串翻转问题很有帮助。本篇博客到此就结束了,感谢大家的支持与观看,如果有好的建议欢迎留言喔,谢谢大家啦!

相关推荐
奋斗的小花生15 分钟前
c++ 多态性
开发语言·c++
魔道不误砍柴功18 分钟前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
闲晨21 分钟前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程1 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
UestcXiye2 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp
Chrikk2 小时前
Go-性能调优实战案例
开发语言·后端·golang
幼儿园老大*2 小时前
Go的环境搭建以及GoLand安装教程
开发语言·经验分享·后端·golang·go
canyuemanyue2 小时前
go语言连续监控事件并回调处理
开发语言·后端·golang
杜杜的man2 小时前
【go从零单排】go语言中的指针
开发语言·后端·golang
霁月风3 小时前
设计模式——适配器模式
c++·适配器模式