算法力扣刷题——总结篇【四】和string类详解

前言

字符串章节部分跟随学习结束,作出总结。


一、题目及方法总结

(1)反转字符串:双指针法。

  • 反转全部字符串,i在开头,j在结尾;判断条件i < j ;
  • 每隔2k反转前k个字符,i++改成i += 2k;调用反转函数,给出start,end,左闭右开可以。

(2)替换数字:逆向操作数组。先扩容,再修改,i指向size-1开始,k指向扩容的末尾:

  • 如果遇到数字字符,number也倒着填充k- -。
  • 这里填充需要覆盖,但是不会影响没操作的字符。

(3)翻转字符串中的单词:

  • 先删除多余空格:双指针法。fast和slow都从0出发,如果s[fast] == ’ '时,slow不动;不等于空格时,s[slow] = s[fast],slow++,这一步是while不是if。额外处理单词之间的一个空格,if(slow != 0)。
  • 整体反转;
  • 单个单词反转。

(4)右旋字符串

  • 整体反转,再分两段反转

(5)匹配字符串

  • KMP算法,构造next前缀表。初始化——不相等时,j = next[j-1];相等时j++。j指向前缀结束的后一位。i指向后缀末尾。
  • 遇到不相同元素,查看next[j-1]后,j = next[j-1],while。再if(s[j] == s[i]),满足j++。if(j == 模式串size),return。

(6)重复子字符串

  • 利用前缀表含义:前缀=后缀,并且长度最长。

总结:完成字符串题目和思路回顾。


二、 C++中string类

参考链接:cplusplus.com/reference/string/string/
记录常用用法:

定义

(1)#include < string > 依然是一个,使用string就是创建对象调用函数实现功能。
(2)“字符串”:字符序列,偶尔可以看作和数组相通,数组中类型是char。

typedef basic_string<char> string;
//basic_string是类模板,把类型定义成char,就是string

(1)构造函数

很多种方法可以构造string,所以对应的函数原型有很多:

(1)	 string();//默认构造函数:size=0;还没有放字符。
(2)	string (const string& str); //拷贝构造函数:得到和参数一样的字符串
(3)	string (const string& str, size_t pos, size_t len = npos);//复制参数的str,从pos开始(包括pos),长度可以指定,默认到字符串末尾。
(4)	string (const char* s);//把C风格的字符串转换成string,C风格的'\0'结尾不转换。
(5)	string (const char* s, size_t n);//指定前n个字符,肯定包含空格。
(6)	string (size_t n, char c);//指定长度,用字符c初始化
(7)	template <class InputIterator>  string  (InputIterator first, InputIterator last);//[first,last),迭代器类型指定范围。8)初始化列表作为参数;

(2)重载=运算符

和(1)构造同理,也用来定义string。“=”后面三种类型:string、char*、char

(1)	string& operator= (const string& str); 
(2)	string& operator= (const char* s);
(3)	string& operator= (char c);

(3)iterator

可以用iterator只做指向,不去修改。(前两个就可以直接用)。

begin();——end();//正向,如果修改了常量string,也会报错。
rbegin();——rend();//逆向
cbegin();——cend();//不能修改const。
crbegin();——crend();//不能修改const。

(4)大小

size();//和length();一样。
max_size();//string类的最大范围
capacity();//当前给string分了多少
void resize(size_t n);//改变长度到n,如果n小于原有size,超出部分删掉;如果n比原有size大,用空字符扩展
void resize(size_t n,char c);//如果n比原有size大,用指定的c初始化扩展的字符。
clear();//清空
empty();//判断是否为空

(5)访问元素

直接用下标最方便

char& oprator[](size_t pos);//通过下标访问,返回是字符的引用,所以对原字符操作。
char& at (size_t pos);//比如:str.at(4);返回是字符的引用,所以对原字符操作。
char& back();//返回string的最后一个字符引用
char& front();//返回string的第一个字符引用

(6)修改字符串

  • 末尾增加string:前两个可以追加多个字符;push_back只能增加一个字符。

    string& operator+=();//末尾追加。参数类型可以是string、char*、char
    string& append();//函数原型众多,类似构造函数的(2)~(7),参数类型等同于构造函数的(2)~(7)
    void push_back (char c);//只能增加一个字符。
    
  • 覆盖原有string,替换新值,全部覆盖换新。assign和append一样,参数类似构造函数(2)~‘(7)

    string& assign();
    
  • 指定位置插入字符:第一个参数得指定位置,在这个位置之前插入不定数量的字符/字符串。剩余参数还是和构造函数(2)~(7)一个性质。

    string& insert (size_t pos, const string& str);
    string& insert (size_t pos, const string& str, size_t subpos, size_t sublen);
    string& insert (size_t pos, const char* s);
    string& insert (size_t pos, const char* s, size_t n);
    string& insert (size_t pos,   size_t n, char c);
    iterator insert (const_iterator p, char c);
    template <class InputIterator>iterator insert (iterator p, InputIterator first, InputIterator last);
    string& insert (const_iterator p, initializer_list<char> il);
    
  • 删除:erase时间复杂度O(n)。三种方式。

    erase:
    string& erase (size_t pos = 0, size_t len = npos);//给位置和长度,这个位置后面的所有都删掉
    iterator erase (const_iterator p);//给一个iterator,删掉p指定的字符
    iterator erase (const_iterator first, const_iterator last);//给一个范围,iterator类型的范围
    viod pop_back();//删掉最后一个,但是没有返回值。
    
  • 替换replace:指定长度和范围,以及用什么替换,在原有的基础上覆盖。长度和范围可以是pos和len结合,也可以是iterator类型,左闭右开;用什么替换,对象类型类似构造函数(2)~(7)。

  • 交换两个str类型的内容:

    void swap (string& str);
    

(7)字符串操作(建立string对象和C-字符串的关系)

  • 通过构造函数可以把C-字符串作为参数传递给string对象,相当于把C-字符串转换成string类型;那么也可以把string类型转换成C-字符串

    const char* c_str();//str.c_str();没有参数,string对象直接调用;返回一个字符数组,C-字符串。
    const char* data();//和c_str函数作用一样,返回一个C数组。相当于转换成C-字符串。
    
  • string复制字符序列:用char* 数组存放。但是要手动添加’\0’。

    size_t copy (char* s, size_t len, size_t pos = 0) const;
    解释:参数:第一个是字符复制后存放的数组,第二个指定长度,第三个指定开始位置(包括pos)。
    注意:和(6)指定位置和长度参数前后相反:(6)中基本上是位置在前,长度在后;copy是len在第二个,pos在第三个。
    返回值:复制给s数组的字符数量。
    
  • find:类似strchr和strstr函数的功能。(rfind

    //以下返回值都是:size_t,如果找到,就返回第一个匹配字符的位置(下标);没找到,返回npos=-1。
    //和strchr和strstr返回类似,如果找到,返回char* 指向首个字符;没找到char* 指向NULL。
    size_t find (const string& str, size_t pos = 0) const noexcept;
    //在str中找另一个str参数,默认位置从0开始,可以自己指定pos,那么从包含pos之后开始找。str1.find(str2,0);
    size_t find (const char* s, size_t pos = 0) const;
    //参数可以给string对象,也可以给char* 数组。
    size_t find (const char* s, size_t pos, size_type n) const;
    //多了一个n,指定匹配多长的字符
    size_t find (char c, size_t pos = 0) const noexcept;
    //等同与strchr功能,找一个字符。
    rfind函数:参数和find一样,同样有4个函数原型;但是的逆向找。类似strrchr函数功能。
    

    总结:前三个可以用来找字符串,多个字符,必须全字匹配,单个匹配不行等同strstr函数功能;最后一个用来找单个字符,等同strchr函数功能

    那么不需要全字匹配的话:使用find_first_of,参数和find相同,区别:找到参数包含字符的其中一个就可以,无需全字匹配,等同于strpbrk函数。自然和rfind对应的有:find_last_of

    再进一步:找不匹配的第一个字符,没有在参数中指定。正向:find_first_not_of等同于strspn函数;倒向:find_last_not_of

  • 生成子字符串:substr。类似strtok函数

    string substr (size_t pos = 0, size_t len = npos) const;
    传递参数:指定位置和长度。返回一个string对象。
    对比strtok函数:
    char* strtok_s(char* s;const char *_Delimiter, char **_Context);
    
  • 比较字符串:类似strcmp函数
    返回值:(1)等于0,代表相等;(2)大于0,代表大于:ASCII码更大或者长度更长;(3)小于0,调用者小于参数。ASCII码更小或者长度更短;

    int compare (const string& str) const noexcept;
    //传递string,可以。
    int compare (size_t pos, size_t len, const string& str) const;
    //先对调用者指定位置和长度,和string比较。
    int compare (const char* s) const;
    //传递char*类型,可以。融合C-字符串
    int compare (size_t pos, size_t len, const char* s, size_t n) const;
    //对调用者指定位置和长度,再对char指定比较长度。
    

(8)非成员函数的功能重载,针对string类型

  • 重载+,起到连接的作用。

    string operator+ (const string& lhs, const string& rhs);
    //+两端是string类型
    string operator+ (const string& lhs, const char*   rhs);
    //+一端是string类型,一端是C-字符串
    string operator+ (const string& lhs, char  rhs);
    //+一端是string类型,一端是字符char。
    
  • 关系运算符:==、!=、<=、>=、<、>。还是调用compare函数,但是直接用运算符更方便。

  • 可以调用swap,传递一个参数交换string内容;也可以用swap传递两个string参数交换:

    void swap (string& x, string& y);
    
  • 重载运算符:>>、<<,直接把string一整个输出/输入。

    比如:
    cin>>str;
    cout<<str1;
    
  • getline输入string。把分隔符一起读取,但是不存储分割符

    istream& getline (istream&  is, string& str, char delim);
    //指定分隔符
    istream& getline (istream&  is, string& str);
    //默认分割符'\n',每次输入敲下回车键,会转换成'\n'.
    比如:
    getline(cin,str,' ');//遇到空格停止。
    getline(cin,str);//默认遇到'\n'.
    

三、总结

说几点:

  • 为了兼容C-字符串,char* 类型可以作为参数传递;但是把string转换成char*,调用c_str()或者data()函数。
  • 基本上是先指定pos位置,再指定len长度;但是copy是先指定长度,再说位置(特例)。

(欢迎指正,转载标明出处)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/865342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

东方韵味:红酒与茶道的很好邂逅

在古老的东方&#xff0c;茶道与红酒各自承载着深厚的文化底蕴和历史传承。当这两大传统文化碰撞、交融&#xff0c;仿佛展开了一幅绚烂多姿的画卷&#xff0c;既展现了东方的神秘韵味&#xff0c;又融入了红酒的异国风情。今天&#xff0c;就让我们一同探索这场红酒与茶道的很…

详解微服务应用灰度发布最佳实践

作者&#xff1a;子丑 本次分享是站在 DevOps 视角的灰度发布实践概述&#xff0c;主要内容包括以下四个方面&#xff1a; 第一&#xff0c;灰度发布要解决的问题&#xff1b; 第二&#xff0c;灰度发布的四种典型场景&#xff1b; 第三&#xff0c;如何把灰度发布融入到应…

2024年07月03日 Redis部署方式和持久化

Redis持久化方式&#xff1a;RDB和AOF&#xff0c;和混合式 RDB&#xff1a;周期备份模式&#xff0c;每隔一段时间备份一份快照文件&#xff0c;从主线程Fork一个备份线程出来备份&#xff0c;缺点是会造成数据的丢失。 AOF&#xff1a;日志模式&#xff0c;每条命令都以操作…

Java8环境安装(jdk1.8安装)详细教程

Java 8环境安装&#xff08;jdk1.8安装&#xff09;详细教程 Java 8&#xff08;也称为JDK 1.8&#xff09;&#xff0c;是Oracle公司于2014年3月发布的一个重要的Java语言版本。这个版本自发布以来&#xff0c;因其众多的新特性和改进&#xff0c;被认为是Java语言发展历程中…

itk::ShapedNeighborhoodIterator类C2516问题

错误问题&#xff1a; 1>C:\itk\src-5.3.0\Modules\Core\Common\include\itkShapedNeighborhoodIterator.h(183,1): error C2516: itk::ShapedNeighborhoodIterator<TImage,TBoundaryCondition>::ConstIterator: is not a legal base class 1>C:\itk\src-5.3.0\Mo…

【FFmpeg】avcodec_send_frame函数

目录 1.avcodec_send_frame1.1 将输入的frame存入内部buffer&#xff08;encode_send_frame_internal&#xff09;1.1.1 frame的引用函数&#xff08;av_frame_ref &#xff09;1.1.1.1 帧属性的拷贝&#xff08;frame_copy_props&#xff09;1.1.1.2 buffer的引用函数&#xf…

Appium 使用隐式等待,无法执行代码怎么办?

简介 添加等待是为了确保自动化脚本在执行过程中与应用程序之间的同步和稳定性。 应用程序的响应时间是不确定的&#xff0c;可能存在网络延迟、加载时间、动画效果等因素。如果在执行自动化脚本时没有适当的等待机制&#xff0c;脚本可能会在应用程序还未完成相应操作或加载完…

转让5000万无区域能源公司要求和流程

国家局的公司&#xff0c;也就是无地域无区域性的公司名称。这样的公司是还可以继续注册的&#xff0c;但是想要拥有国家局无区域的名称就不是那么容易的了。总局的企业要求高&#xff0c;也是实力的体现。对字号有保护。所以有很多人都对无地域的名称一直情有独钟。现有一家名…

智能视频监控平台LntonCVS视频监控汇聚平台系统详细介绍

视频监控综合管理平台是专为大中型用户设计的安防管理软件&#xff0c;旨在实现跨区域网络化视频监控的集中管理。该平台集成了信息资源管理、设备管理、用户管理、网络管理和安全管理等多项功能&#xff0c;能够集中管理监控中心的所有视频图像&#xff0c;支持多品牌设备联网…

AI基准测评(下):视频生成、代码能力、逻辑推理,AI是否已经超越人类?

本文作者&#xff1a;王加龙&#xff0c;阿里云高级算法专家 文章推荐 AI实测&#xff5c;基于图像、语言与声音&#xff0c;人工智能是否已经超越了人类&#xff1f; 知乎AI产品“直答”正式上线&#xff01;文心一言4.0 Turbo来袭&#xff0c;可为农民提供专业指导&#x…

Fork/Join框架

什么是 Fork/Join Fork/Join 框架是 Java7 提供了的一个用于并行执行任务的框架&#xff0c; 是一个把大任务分割成若干个小任务&#xff0c;最终汇总每个小任务结果后得到大任务结果的框架。 分治 我们再通过 Fork 和 Join 这两个单词来理解下 Fork/Join 框架&#xff0c;F…

数据库设计规范(DOC文件)

1 编写目的 2 数据库策略 2.1 数据库对象长度策略 2.2 数据完整性策略 2.3 规范化设计与性能之间的权衡策略 2.4 字段类型的定义与使用策略 3 命名规范 3.1 数据库命名规则 3.2 数据库对象命名的一般原则 3.3 表空间(Tablespace)命名规则 3.4 表(Table)命名规则 3.5…

Java 虚拟机 一

运行时数据区 我们先看线程隔离的数据区 程序计数器 程序计数器&#xff08; Program Counter Register&#xff09; 是一块较小的内存空间&#xff0c; 它可以看作是当前线程所执行的字节码的行号指示器。 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执…

提升用户体验之requestAnimationFrame实现前端动画

1)requestAnimationFrame是什么? 1.MDN官方解释 2.解析这段话&#xff1a; 1、那么浏览器重绘是指什么呢&#xff1f; ——大多数电脑的显示器刷新频率是60Hz&#xff0c;1000ms/6016.66666667ms的时间刷新一次 2、重绘之前调用指定的回调函数更新动画&#xff1f; ——requ…

六西格玛绿带培训ROI:你的投资究竟值不值?

近年来&#xff0c;企业对于员工培训的投入日益增加&#xff0c;六西格玛绿带培训更是作为提升企业运营效率和质量管理的利器&#xff0c;更是备受关注。然而&#xff0c;面对高昂的培训成本&#xff0c;企业如何评估六西格玛绿带培训的投资回报率&#xff08;ROI&#xff09;呢…

安装Intel Realsense D435i驱动与ROS包报错

1.下载安装realsense SDK 1.1 安装依赖 sudo apt install libudev-dev pkg-config libgtk-3-dev sudo apt install libusb-1.0-0-dev pkg-config sudo apt install libglfw3-dev sudo apt install libssl-dev1.2 权限 cd librealsense/ sudo cp config/99-realsense-libusb.…

一万年太久,只争朝夕 | Foundation model的进展仍不够快

编者按&#xff1a;如今根基模型&#xff08;Foundation Models&#xff09;的应用和相关创新正在快速涌现&#xff0c;但仍有很大的提升空间&#xff0c;目前还无法充分发挥根基模型的潜能、将其高效快速地应用于企业级AI应用中。 根基模型的加速应用和落地&#xff0c;带动了…

64、基于去噪卷积神经网络的彩色图像去噪(matlab)

1、基于去噪卷积神经网络的彩色图像去噪的原理及流程 基于去噪卷积神经网络的彩色图像去噪是一种基于深度学习的图像处理技术&#xff0c;可以有效地去除图像中的噪声&#xff0c;提高图像的质量。下面是在Matlab中实现基于去噪卷积神经网络的彩色图像去噪的原理及流程&#x…

移动端响应式布局开发的四大方案

移动端响应式布局开发的四大方案 media媒体查询remflexvh/vw media媒体查询 媒体查询通常会结合百分比实现自适应&#xff0c;它经常应用于pc端与移动端是一套项目代码的情况&#xff0c;依据媒体查询写多套不同的样式 rem pc端和移动端是两套代码的&#xff0c;通常pc端不做…

ChatGPT如何应用在谷歌seo?

ChatGPT在提升博客和创作效率方面非常有用。它可以帮助你快速生成吸引人的标题&#xff0c;确保内容第一眼就能抓住读者的注意力。不仅如此&#xff0c;ChatGPT还能根据你的主题生成详细的文章提纲&#xff0c;让你在写作时思路更加清晰。关键词优化也是它的强项&#xff0c;可…