【字符串算法题记录】反转字符串中的单词(leetcode),右旋字符串(kama)——双指针以及反转的奇思妙用

本文主要是介绍【字符串算法题记录】反转字符串中的单词(leetcode),右旋字符串(kama)——双指针以及反转的奇思妙用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

反转字符串中的单词

题目链接

思考

这题的思路顺序是:移除多余空格(双指针法)——》反转整个字符串)——》反转字符串中每个单词。

移除多余空格(双指针法)

因为字符串开头也可能有多个字符,所以我们的两个指针应该从头开始,用快指针判断当前字符是否是题目中的有效字符(非多余空格),慢的则用来将快指针指向字符赋值到自己。具体代码如下:

// 消除多余空格void eraseSpace(string& s) {int slow = 0; // 设置慢指针for(int i = 0; i < s.size(); i++) { // i相当于快指针if(s[i]!=' ') { // 当i不是空格时,即我们遇到单词的第一个字母啦if(slow!=0) s[slow++] = ' '; // 首先判断当前是不是第一个单词,因为第一个单词前面不需要空格,所以只要不是第一个单词,我们就在它前面加上空格while(s[i]!=' ' && i < s.size()) // 循环整个单词到其结尾s[slow++] = s[i++]; }}s.resize(slow);}

反转字符串

// 反转整个字符串void reverseString(string& s, int begin, int end) {for(int i = begin, j = end; i < j; i++, j--) swap(s[i], s[j]);}

反转字符串中每个单词

这应该是我们的最后一步,目的是定位到字符串中的单词,对它进行反转。这里我是用while循环到每个单词的末尾,代码随想录中是找到分隔空格来定位单词,两种方法都可以。

  • 我的:
string reverseWords(string s) {eraseSpace(s);reverseString(s, 0, s.size()-1);int begin = 0;for(int i = 0; i < s.size(); i++){if(s[i]!=' ') {while (s[i]!=' ' && i < s.size()) i++; // 循环到单词末尾reverseString(s, begin, i-1); // 反转当前单词begin = i+1; // 找到下一个单词的开头index}}return s;}
  • 代码随想录:
string reverseWords(string s) {removeExtraSpaces(s); //去除多余空格,保证单词之间之只有一个空格,且字符串首尾没空格。reverse(s, 0, s.size() - 1);int start = 0; //removeExtraSpaces后保证第一个单词的开始下标一定是0。for (int i = 0; i <= s.size(); ++i) {if (i == s.size() || s[i] == ' ') { //到达空格或者串尾,说明一个单词结束。进行翻转。reverse(s, start, i - 1); //翻转,注意是左闭右闭 []的翻转。start = i + 1; //更新下一个单词的开始下标start}}return s;

整体代码

class Solution {
public:// 消除多余空格void eraseSpace(string& s) {int slow = 0; // 设置慢指针for(int i = 0; i < s.size(); i++) { // i相当于快指针if(s[i]!=' ') { // 当i不是空格时,即我们遇到单词的第一个字母啦if(slow!=0) s[slow++] = ' '; // 首先判断当前是不是第一个单词,因为第一个单词前面不需要空格,所以只要不是第一个单词,我们就在它前面加上空格while(s[i]!=' ' && i < s.size()) // 循环整个单词到其结尾s[slow++] = s[i++]; }}s.resize(slow);}// 反转整个字符串void reverseString(string& s, int begin, int end) {for(int i = begin, j = end; i < j; i++, j--) swap(s[i], s[j]);}string reverseWords(string s) {eraseSpace(s);reverseString(s, 0, s.size()-1);int begin = 0;for(int i = 0; i < s.size(); i++){if(s[i]!=' ') {while (s[i]!=' ' && i < s.size()) i++; // 循环到单词末尾reverseString(s, begin, i-1); // 反转当前单词begin = i+1; // 找到下一个单词的开头index}}return s;}};

右旋字符串

题目链接

思考

在不利用额外空间的条件下,看似很困难,实际上沿用上题的思想就很简单。拿abcdefg, k=2举例,我们要做的是将最后两个字符放到前面去,即fgabcde。实际上我们可以把整个字符串看成两段:abcdefg

  • 首先反转整个字符串,这样一来就实现了上面两段字符的反转:gf edcba
  • 然后再分别对这两段进行反转,就得到了我们想要的:fg abcde

cpp代码

#include <iostream>
using namespace std;void reverse(string& s, int begin, int end) {for(int i = begin, j = end; i < j; i++, j--) {swap(s[i], s[j]);}
}int main() {int k;string s;cin >> k; // 获取第一行:右旋转的位数cin >> s; // 获取第二行:字符串reverse(s, 0, s.size()-1); // 字符串整体反转reverse(s, 0, k-1); //反转右旋转的字符reverse(s, k, s.size()-1); // 反转剩下的字符cout << s << endl;
}

这篇关于【字符串算法题记录】反转字符串中的单词(leetcode),右旋字符串(kama)——双指针以及反转的奇思妙用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/852407

相关文章

MySQL 字符串截取函数及用法详解

《MySQL字符串截取函数及用法详解》在MySQL中,字符串截取是常见的操作,主要用于从字符串中提取特定部分,MySQL提供了多种函数来实现这一功能,包括LEFT()、RIGHT()、SUBST... 目录mysql 字符串截取函数详解RIGHT(str, length):从右侧截取指定长度的字符SUBST

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Python将字符串转换为小写字母的几种常用方法

《Python将字符串转换为小写字母的几种常用方法》:本文主要介绍Python中将字符串大写字母转小写的四种方法:lower()方法简洁高效,手动ASCII转换灵活可控,str.translate... 目录一、使用内置方法 lower()(最简单)二、手动遍历 + ASCII 码转换三、使用 str.tr

Java如何用乘号来重复字符串的功能

《Java如何用乘号来重复字符串的功能》:本文主要介绍Java使用乘号来重复字符串的功能,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java乘号来重复字符串的功能1、利用循环2、使用StringBuilder3、采用 Java 11 引入的String.rep

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Java实现按字节长度截取字符串

《Java实现按字节长度截取字符串》在Java中,由于字符串可能包含多字节字符,直接按字节长度截取可能会导致乱码或截取不准确的问题,下面我们就来看看几种按字节长度截取字符串的方法吧... 目录方法一:使用String的getBytes方法方法二:指定字符编码处理方法三:更精确的字符编码处理使用示例注意事项方

基于Python打造一个智能单词管理神器

《基于Python打造一个智能单词管理神器》这篇文章主要为大家详细介绍了如何使用Python打造一个智能单词管理神器,从查询到导出的一站式解决,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 项目概述:为什么需要这个工具2. 环境搭建与快速入门2.1 环境要求2.2 首次运行配置3. 核心功能使用指

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自