代码随想录 -- 字符串

文章目录

  • 反转字符串
    • 描述
    • 题解
  • 反转字符串II
    • 描述
    • 题解
  • 替换数字
    • 描述
    • 题解:replace函数
    • 题解:双指针
  • 翻转字符串里的单词
    • 描述
    • 题解
  • 右旋字符串
    • 描述
    • 题解
  • 实现 strStr()
    • 描述
    • 题解:暴力算法
    • 题解:KMP算法(懵懂)
  • 重复的子字符串
    • 描述
    • 题解
    • 题解:暴力
    • 题解:KMP
    • 题解:移动匹配

反转字符串

题目链接

描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。

示例 1:
输入:[“h”,“e”,“l”,“l”,“o”]
输出:[“o”,“l”,“l”,“e”,“h”]

示例 2:
输入:[“H”,“a”,“n”,“n”,“a”,“h”]
输出:[“h”,“a”,“n”,“n”,“a”,“H”]

题解

C++库函数 reverse 做题肯定要了解其内部原理

class Solution {
public:void swap(char&c1,char&c2){char tmp = c1;c1=c2;c2=tmp;}void reverseString(vector<char>& s) {size_t left = 0,right = s.size()-1;while(left <right){swap(s[left],s[right]);++left;--right;}}
};

反转字符串II

题目链接

描述

给定一个字符串 s 和一个整数 k,从字符串开头算起, 每计数至 2k 个字符,就反转这 2k 个字符中的前 k 个字符。

如果剩余字符少于 k 个,则将剩余字符全部反转。

如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

示例:

输入: s = “abcdefg”, k = 2
输出: “bacdfeg”

题解

字符串是一段一段的进行反转,所以我们在循环的时候可以每次+一段

class Solution {
public:string reverseStr(string s, int k) {size_t len = s.size();// 对于字符串是一段一段的处理 所以可以一次跳一段for(int i=0;i<len;i+=2*k){if(i+k<=len){reverse(s.begin()+i,s.begin()+i+k);continue;}reverse(s.begin()+i,s.end());}return s;}
};

替换数字

题目链接

描述

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。

例如,对于输入字符串 “a1b2c3”,函数应该将其转换为 “anumberbnumbercnumber”。

对于输入字符串 “a5b”,函数应该将其转换为 “anumberb”

输入:一个字符串 s,s 仅包含小写字母和数字字符。

输出:打印一个新的字符串,其中每个数字字符都被替换为了number

样例输入:a1b2c3

样例输出:anumberbnumbercnumber

数据范围:1 <= s.length < 10000。

题解:replace函数

利用string的replace函数

#include <iostream>
#include <string>
using namespace std;void change_string(string&s){size_t len = s.size();for(int i=0;i<len;++i){if(s[i]<='9'&&s[i]>='0'){s.replace(s.begin()+i,s.begin()+i+1,"number");len+=5;i+=5;			}}
}
int main(){string s{"1das1das25das"};change_string(s);cout<<s<<"\n";return 0;
}

题解:双指针

先将字符串扩充到最后的大小,然后从后先前进行填充

#include <iostream>
#include <string>
using namespace std;void change_string(string&s){size_t old_len = s.size();int count{0};for(int i=0;i<old_len;++i){if(s[i]<='9'&&s[i]>='0')++count;}s.resize(old_len+5*count);size_t new_len = s.size();for(int front = old_len-1,back=new_len-1;front>=0;--back,--front){if(s[front]>='0'&&s[front]<='9'){s[back]='r';s[back-1]='e';s[back-2]='b';s[back-3]='m';s[back-4]='u';s[back-5]='n';back-=5;}elses[back]=s[front];}
}
int main(){string s;cin>>s;change_string(s);cout<<s<<"\n";return 0;
}

翻转字符串里的单词

题目链接

描述

给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:
输入: “the sky is blue”
输出: “blue is sky the”

示例 2:
输入: " hello world! "
输出: “world! hello”
解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

示例 3:
输入: “a good example”
输出: “example good a”
解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

题解

分三个步骤:
1、去除多余空格
2、全部字符串进行反转
3、字符串中的单词进行一个一个的反转

class Solution {
public:void deleteSpace(string &s){int slow{0},fast{0};size_t len{s.size()};//去除多余的前面的空格while(len>0&&fast<len&&s[fast]==' ')++fast;while(fast<len){//去除中间if(fast-1>0&&s[fast-1]==' '&&s[fast]==' '){++fast;continue;}elses[slow++]=s[fast++];}//去除尾部if(slow-1>0&&s[slow-1]==' ')s.resize(slow-1);elses.resize(slow);}//[beg,end]void reverse(string&s,int beg,int end){for(;beg<end;--end,++beg){char tmp = s[beg];s[beg] = s[end];s[end] = tmp;}}string reverseWords(string s) {deleteSpace(s);size_t len = s.size();reverse(s,0,len-1);int i,j;for(i=0,j=0;i<len;++i){if(s[i]==' '){reverse(s,j,i-1);j=i+1;}}reverse(s,j,i-1);return s;}
};

右旋字符串

题目链接

描述

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

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

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

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

样例输入:

2
abcdefg

样例输出:

fgabcde

数据范围:1 <= k < 10000, 1 <= s.length < 10000;

题解

1、整体反转
2、起点到target这一段反转
3、target到结尾这一段反转

#include <iostream>
#include <string>
using namespace std;
// [beg,end]
void my_reverse(string&s,int beg,int end){for(;beg<end;++beg,--end){int tmp = s[beg];s[beg]=s[end];s[end]=tmp;}
}
void rightHanded(string&s,int target){size_t len = s.size();my_reverse(s,0,len-1);my_reverse(s,0,target-1);my_reverse(s,target,len-1);
} 
int main(){string s;int target;cin>>target>>s;rightHanded(s,target);cout<<s<<endl;return 0;
}

实现 strStr()

题目链接

描述

实现 strStr() 函数。

给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。

示例 1: 输入: haystack = “hello”, needle = “ll” 输出: 2

示例 2: 输入: haystack = “aaaaa”, needle = “bba” 输出: -1

说明: 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。

题解:暴力算法

class Solution {
public:int strStr(string haystack, string needle) {if(haystack==""||needle=="")return -1;int pLen = haystack.size(),sLen = needle.size();for(int i = 0; i < pLen;++i){if(haystack[i]==needle[0]){int j = 1;for(;j<sLen;++j)if(haystack[i+j]!=needle[j])break;if(j==sLen)return i;}}return -1;}
};

题解:KMP算法(懵懂)

KMP算法:解决字符串匹配的问题

最长相等前后缀得到前缀表


class Solution {
public:void getNext(int *next,const string&s){/*初始化:i:后缀末尾j:前缀末尾*/int j{-1};next[0] = j;for(int i=1;i<s.size();i++){// 前后缀不相同while(j>=0&&s[j+1]!=s[i])j=next[j];//回退// 前后缀相同if(s[j+1]==s[i])++j;// 将j(前缀的长度)赋给next[i]next[i]=j;}}int strStr(string haystack, string needle) {if(!(haystack.size())||!(needle.size()))return -1;int next[needle.size()];getNext(next,needle);int j = -1; // // 因为next数组里记录的起始位置为-1for(int i=0;i<haystack.size();++i){while(j>=0&&needle[j+1]!=haystack[i])j = next[j];if(haystack[i]==needle[j+1])++j;if(j==(needle.size()-1))return (i-needle.size()+1);}return -1;}
};

重复的子字符串

题目链接

描述

题解

给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。

示例 1:

输入: “abab”
输出: True
解释: 可由子字符串 “ab” 重复两次构成。
示例 2:

输入: “aba”
输出: False
示例 3:

输入: “abcabcabcabc”
输出: True
解释: 可由子字符串 “abc” 重复四次构成。 (或者子字符串 “abcabc” 重复两次构成。)

题解:暴力

class Solution {
public:bool repeatedSubstringPattern(string s) {string tmp,str;for(int i=0;i<s.size()/2;++i){str="";tmp+=s[i];while(str.size()<s.size())str+=tmp;if(str==s)return true;}return false;}
};

题解:KMP

class Solution {
public:void getNext(int *next,const string &s){int j=-1;next[0]=j;for(int i=1;i<s.size();i++){while(j>=0 && s[i]!=s[j+1])j=next[j];if(s[i]==s[j+1])++j;next[i]=j;}}bool repeatedSubstringPattern(string s) {int len = s.size();if(len==0)return false;int next[len];getNext(next,s);if(next[len-1]!=-1 && len % (len - (next[len-1]+1))==0)return true;return false;}
};

题解:移动匹配

class Solution {
public:bool repeatedSubstringPattern(string s) {string t = s+s;t.erase(t.end()-1);if(t.find(s,1)!=string::npos)return true;return false;}
};

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

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

相关文章

数据备份(上)

备份的意义 数据备份是容灾的基础&#xff0c;防止系统出现操作失误或者遭受网络攻击导致数据丢失&#xff0c;为保证数据安全和业务连续性&#xff0c;有效的防护措施&#xff0c;对数据进行合理的备份、防范于未然。 面临的威胁 去年2023年10月亲自经历客户某网站无法访问…

WEB-UI自动化测试实践

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

已解决的问题:BIOS中Enter键失效_BIOS中回车键没反应

问题&#xff1a; 未解决的问题&#xff1a;BIOS中enter键失效_bios回车键没反应-CSDN博客 问题复现&#xff1a; Windows7 关机 开机按F2进入BIOS 调整Boot Mode&#xff0c;按Enter建&#xff0c;Enter键失效 按F10&#xff0c;按Enter键&#xff0c;Enter键失效 按E…

LeetCode59-螺旋矩阵II

参考链接&#xff1a;代码随想录->螺旋矩阵II 关键是学视频链接里面的编码思想&#xff0c;然后背下来 class Solution { public:vector<vector<int>> generateMatrix(int n) {vector<vector<int>> resvector(n,vector<int>(n,0));int sx0,s…

HTML好玩代码(正式版)

今天给大家几个好玩儿的HTML代码&#xff0c;可以自行修改文字&#xff0c;更改效果&#xff08;一定要看到最后&#xff09;&#xff0c;代码&#xff0c;&#x1f389;走起&#xff1a; 一、圣诞树效果&#xff08;音乐可自行选择&#xff09; 代码&#xff1a; <!DOCTY…

vite是什么

vite 是什么 vite —— 一个由 vue 作者尤雨溪开发的 web 开发工具 Vite由两个主要部分组成 dev server&#xff1a;利用浏览器的ESM能力来提供源文件&#xff0c;具有丰富的内置功能并具有高效的HMR生产构建&#xff1a;生产环境利用Rollup来构建代码&#xff0c;提供指令用…

基于情感分析的网上图书推荐系统

项目&#xff1a;基于情感分析的网上图书推荐系统 摘 要 基于网络爬虫的数据可视化服务系统是一种能自动从网络上收集信息的工具&#xff0c;可根据用户的需求定向采集特定数据信息的工具&#xff0c;本项目通过研究爬取网上商品评论信息实现商品评论的情感分析系统功能。对于…

嵌入式学习25-复习指针要点

1指针 1.1语法&#xff1a; 【基类型*指针变量名】 【int *p&a】 1 2 1.2语义&#xff1a; 【基类型】&#xff1a;指针变量指向的目标的数据类型 【*】&#xff1a;表示此时定义的变量是一个指针类型的变量 【&a】&#xff1a;一块存放着int类型数据的空间的地址 【*p…

Flutter开发LongPressDraggable、Draggable 的onDragEnd没有被调用

文章目录 onDragEnd 什么时候执行&#xff1f;onDragEnd 在拖动结束时没有被调用的可能原因 onDragEnd 什么时候执行&#xff1f; onDragEnd 回调函数在拖动结束时执行&#xff0c;但要注意&#xff0c;拖动结束有多种情况&#xff0c;不仅仅是松开手指触发的。 onDragEnd 会…

【国产MCU】-CH32V307-通用定时器(GPTM)-单脉冲模式

通用定时器(GPTM)-单脉冲模式 文章目录 通用定时器(GPTM)-单脉冲模式1、单脉冲模式介绍2、驱动API介绍3、单脉冲使用实例本文将详细介绍如何使用CH32V307通用定时器的单脉冲模式。 1、单脉冲模式介绍 单脉冲模式可以响应一个特定的事件,在一个延迟之后产生一个脉冲,延迟…

Seata 的 AT 模式

目录 概述 Springcloud 整合 Seata 数据库脚本 服务依赖 Springboot 配置 代码改造 AT模式下的数据隔离 写隔离 读隔离 概述 Seata 的 AT 模式是 Seata 的默认模式&#xff0c;它的原理是依赖于数据库事务&#xff0c;以数据库事务保证本地事务分支特性&#xff0c;结合…

windows系统用VS环境开发linux程序之一

主要有两种方法&#xff0c;一种是在windows中安装linux子系统&#xff0c;即WSL&#xff0c;另一种是windows系统装linux虚拟机。 这里先用虚拟机方法。参考文章&#xff1a; 用VS2015开发Linux程序详细教程-配置篇_vs2015可以在linux安装吗-CSDN博客 这篇基本就够了。不过…

nginx之web性能location优先级

4.2 event事件 events {worker_connections 65536; #设置单个工作进程的最大并发连接数use epoll;#使用epoll事件驱动&#xff0c;Nginx支持众多的事件驱动&#xff0c;比如:select、poll、epoll&#xff0c;只能设置在events模块中设置。accept_mutex on; #on为同一时刻一个…

设计模式之委派模式

文章目录 前言正文一、生活中的例子二、Java代码实现2.1 类设计2.2 代码实现2.2.1 Employee2.2.2 ArchitectureDesignEmployer2.2.3 BackEmployer2.2.4 FrontEmployer2.2.5 Leader2.2.6 EmployeeStrongPointEnum2.2.7 Boss 2.3 测试2.3.1 Client2.3.2 测试结果 三、委派模式的优…

Docker Desktop 4.27.1 Windows 10 安装 教程

Docker Desktop 4.27.1 Windows 10 安装 版本要求windows 版本要求wsl 版本要求docker desktop 版本 安装首先确保系统版本符合要求前提下安装wsl安装 Dockers Desktop安装说明 安装问题docker Desktop 无法正常启动&#xff0c;提示wsl 相关信息wsl --install 执行输出帮助日志…

Python 程序中查看 Python version

Python 程序中查看 Python version 1. Code2. OutputReferences 1. Code #!/usr/bin/env python3 # -*- coding:utf-8 -*-import platform import sysprint("\nplatform.python_version():") print(platform.python_version())print("\nsys.version:") pr…

springboot大学生体质测试管理系统源码和论文

大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息&#xff0c;通过留言区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分&#xff0c;系统管理员主要功能包括首…

图像分类入门:使用Python和Keras实现卷积神经网络

文章标题&#xff1a;图像分类入门&#xff1a;使用Python和Keras实现卷积神经网络 简介 图像分类是计算机视觉领域的一个重要任务&#xff0c;它涉及将图像分成不同的类别或标签。卷积神经网络&#xff08;CNN&#xff09;是图像分类任务中的一种常用模型&#xff0c;它能够…

rust实战系列十四:复合数据类型

复合数据类型可以在其他类型的基础上形成更复杂的组合关系。 本章介绍tuple、struct、enum等几种复合数据类型。数组留到第6章介绍。 2.3.1 tuple tuple指的是“元组”类型&#xff0c;它通过圆括号包含一组表达式构成。tuple内的元素没 有名字。tuple是把几个类型组合到一起的…

第三十九天| 62.不同路径、63. 不同路径 II

Leetcode 62.不同路径 题目链接&#xff1a;62 不同路径 题干&#xff1a;一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “…