首页 > 其他分享 >字符串探索篇

字符串探索篇

时间:2024-07-25 19:29:20浏览次数:10  
标签:单词 slow 探索 ++ fast 空格 字符串

leetcode151——反转字符串中的单词

题目描述:

给你一个字符串 s ,请你反转字符串中 单词 的顺序。

单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。

返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。

注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。

示例 1:

输入:s = "the sky is blue"
输出:"blue is sky the"

示例 2:

输入:s = "  hello world  "
输出:"world hello"
解释:反转后的字符串中不能存在前导空格和尾随空格。

示例 3:

输入:s = "a good   example"
输出:"example good a"
解释:如果两个单词间有多余的空格,反转后的字符串需要将单词间的空格减少到仅有一个。

算法思想:

先将整个字符串逆置,在将字符串中的单词逆置,这样就可以得到我们的目标接近版,只要将字符串中的多余空格去掉就可以得到我们最终的目标字符串。经典的草图,哈哈哈,还有解法效率不高(ㄒoㄒ)

算法实现:

string reverseWords(string s) {
    //整体逆置
    reverse(s.begin(), s.end());
    int start, count;
    for (int i = 0; i < s.size(); i++) {
        count = 1;
        //局部单词逆置
        if ((i == 0 && s[i] != ' ') || (i > 0 && s[i - 1] == ' ' && s[i] != ' ')) {
            start = i;
            while (s[++i] != ' ' && i < s.size()) count++;
            reverse(s.begin() + start, s.begin() + start + count);
        }
    }
    //slow指向起始位置,fast指向第一个字母位置通过将fast指针指向的值赋给slow达到去开头空格效果
    int fast = 0, slow = 0;
    while (s[fast] == ' ') fast++;
    while (fast < s.size()) {
        //如果fast指向的不是空格直接赋值给slow
        if (s[fast] != ' ') {
            s[slow++] = s[fast++];
        }
        /*如果fast指向空格将第一个空格赋给slow(单词之间应该有空格),然后fast一直向后遍历
        直至找到下一个单词的首字母*/
        else if (s[fast] == ' ' ) {
            s[slow++] = s[fast++];
            while (fast < s.size() && s[fast] == ' ') fast++;
        }
    }
    /*重新分配s的空间,这时结尾可能有空格,因为上一步默认单词后面都有空格,没有处理
    最后一个单词后面有多空格的情况*/
    s.resize(slow);
    //去最后一个单词后面的空格
    while (s[slow - 1] == ' ') slow--;
    s.resize(slow);
    return s;
    /*while (s[slow-1] == ' ') slow--;
        return s.substr(0,slow);
    去最后空格也可用这个实现,但上面的快些我也不知道为啥*/
}

代码随想录55——右旋字符串(O(1)的空间复杂度)

题目描述:

字符串的右旋转操作是把字符串尾部的若干个字符转移到字符串的前面。给定一个字符串 s 和一个正整数 k,请编写一个函数,将字符串中的后面 k 个字符移到字符串的前面,实现字符串的右旋转操作。 

例如,对于输入字符串 "abcdefg" 和整数 2,函数应该将其转换为 "fgabcde"。

输入描述

输入共包含两行,第一行为一个正整数 k,代表右旋转的位数。第二行为字符串 s,代表需要旋转的字符串。

输出描述

输出共一行,为进行了右旋转操作后的字符串。

输入示例

2

abcdefg

输出示例

fgabcde

算法思想:

通过前后指针不断地相互赋值,即可在O(1)的空间复杂度下完成。请画图(*^_^*)

算法实现:

#include<iostream>
#include<string>
using namespace std;

int main(){
    int k;
    string s;
    cin>>k;
    cin>>s;
    int pre=0,back=s.size()-k;
    char c;
    for(;pre<s.size()-1;pre++){
        c=s[pre];
        s[pre]=s[back];
        s[back++]=c;
        if(back>=s.size()) back=s.size()-k;
    }
    cout<<s<<endl;
    return 0;
}

标签:单词,slow,探索,++,fast,空格,字符串
From: https://blog.csdn.net/ch_ah/article/details/140693527

相关文章

  • 第九天|字符串| 151.翻转字符串里的单词,卡码网:55.右旋转字符串,28. 实现 strStr(),459.
    边写边更中Day9花了我好长时间,由于一道题有好几种方法,感觉今天上午下午都在做Day9,心态有点崩,因为今天还没有时间科研。我决定休息一下,先更到这里。气死我了151.翻转字符串里的单词方法1_fff:定义一个新的字符串str,遍历s,从后往前找到每个单词添加到str中classSolu......
  • C语言:字符串函数、内存函数剖析
    字符串函数、内存函数剖析一、字符串函数(一)求字符串长度1、strlen(1)库函数实现(2)自定义实现(二)长度不受限制的字符串函数1、strcpy(1)库函数实现(2)自定义实现2、strcat(1)库函数实现(2)自定义实现3、strcmp(1)库函数实现(2)自定义实现(三)长度受限制的字符串函数介绍1、strncpy2、s......
  • 字符串哈希
    首先对于知识点会在8月份更新,目前只是单纯的对一道题进行展示题目链接https://ac.nowcoder.com/acm/contest/87255/E题意:题目要求我们找出两个等长的字符串a和b中的“好”字符数量。一个字符被称为“好”字符,如果它在字符串a和b的所有循环同构字符串中出现的位置......
  • 深入探索SemiDrive E3系列的MCU SSDK
    SemiDriveE3 系列MCUSSDK :XIP模式一、 前言本文介绍基于SSDK3.0调试XIP运行模式。硬件平台:芯驰E3_LQFP176_E3200_A03_048开发板软件平台:SemiDriveSSDK3.0二、 模式简介SFCore的程序XIP运行在FLASH上,XIP程序启动前,需先在IRAM中运行SFCore......
  • 代码随想录 day8|| 151 翻转单词 28 字符串匹配 459 重复子串
    151翻转单词funcreverseWords(sstring)string{ //思考:判断单词条件是从0或者空格开始到终或者空格结尾,最简单方式strings.split之后变成切片,然后反转就行了 //考虑双指针,左指针指向单词首位,右指针指向单词末尾 varres[]byte varleft,rightint forright<len......
  • 使用SpringAI框架实现文字生成图片壁纸:深入探索与实战
    使用SpringAI框架实现文字生成图片壁纸:深入探索与实战在当今的技术世界中,人工智能(AI)已经成为了一个热门话题。无论是自然语言处理、图像识别还是生成对抗网络(GAN),AI的应用场景无处不在。今天,我们将深入探讨如何使用SpringAI框架来实现一个有趣的功能:根据文字生成图片壁纸。什么是......
  • 探索SSM框架:Spring、SpringMVC与Maven的深度整合
    探索SSM框架:Spring、SpringMVC与Maven的深度整合大家好,今天我们来聊聊一个非常经典的JavaWeb开发框架组合——SSM框架。SSM是Spring、SpringMVC和Maven的缩写,这三者的结合可以说是JavaWeb开发中的黄金搭配。本文将带你深入了解SSM框架的核心概念,并通过代码示例来展示如何整合这......
  • C++中字符串的拼接和比较操作
    在C++中,字符串的拼接和比较是常见的操作,这些操作可以通过标准库中的std::string类来实现。下面将分别描述字符串的拼接和比较操作。字符串拼接在C++中,std::string类提供了多种方式来拼接(或称为连接)字符串。最直接的方法是使用+操作符或append()成员函数。使用+操作符cpp复......
  • 如何将unicode编码为字节,以便可以检索到原始字符串?在Python 3.11中
    在python3.11中,我们可以对字符串进行编码,如:string.encode('ascii','backslashreplace')这对于说:hellö=>hell\\xf6但是当我插入时hellöw\\xf6rldIgethell\\xf6w\\xf6rld(注意第二个有一个看起来像字符转义序列的文字部分)......
  • 在 Python 中动态定义文字字符串排列的并集
    我有一个字符串列表:strings=['a','b','c']我想声明列表中所有可能的有序对的Union类型。硬编码,这看起来像:Literal我如何动态定义CustomType=Literal['ab','ac','aa','ba','bb','bc�......