数据结构——字符串

news2025/1/11 8:13:29

1.leetcode 151 

题目链接: 

. - 力扣(LeetCode). - 备战技术面试?力扣提供海量技术面试资源,帮助你高效提升编程技能,轻松拿下世界 IT 名企 Dream Offer。icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-words-in-a-string/题目评价:极好的字符串题目,考察逆转、删除空格,解法多次使用了双指针法

class Solution {
public:
    //逆转字符串s中起始l到末尾r的子串
    void reverse(string& s,int l,int r)
    {
        char tmp = 0;
        while (l < r)
        {
            tmp = s[l];
            s[l] = s[r];
            s[r] = tmp;
            l++; r--;
        }
    }
    

   /* 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。*/
    string reverseWords(string s) {
       //先清除空格,再总体逆转整个字符串,再逐个逆转每个单词
        removeBlanks(s);
        reverse(s, 0, s.length()-1);
        reverseEachWord(s);
        return s;
    }

 //删除前置后置空格,以及单词间冗杂的空格,时间复杂度为O(n)
    void removeBlanks(string& s)
    {
        //erase时间复杂度为O(n),遍历+erase时间复杂度为O(n^2),采用双指针法时间复杂度为O(n)
        int slow=0;  //慢指针指向新字符串元素
        int fast=0;  //快指针遍历字符串
        for (fast = 0; fast < s.length(); fast++)
        {
            //有两类字符:字母-下个字母->放字母,字母-空格->放字母+空格
            if (s[fast] != ' ')
            {
                if (fast == s.length() - 1 || s[fast + 1] != ' ')
                    s[slow++] = s[fast];
                else
                {
                    s[slow++] = s[fast];
                    s[slow++] = ' ';
                }
            }
        }
        //除末尾多余空格
        if (s[slow - 1] == ' ') slow--;
        s.resize(slow);  //slow指示新字符串的大小
    }

    //在删除空格的基础上,实现每个单词逆转,核心是判断单词的开头与结尾,单词开头要么是第一个字符要么是空格之后的第一个字符
    //单词的结尾要么是最后一个字符,要么是空格后的第一个字符
    void reverseEachWord(string& s)
    {
        int l = 0, r = 0;
        for (int r = 0; r <= s.length(); r++)
        {
            if (s[r] == ' '||r==s.length())
            {
                reverse(s, l, r - 1);
                l = r + 1;
            }
        }
    }
};

2. 替换数字(第八期模拟笔试)

时间限制:1.000S  空间限制:128MB

题目描述

给定一个字符串 s,它包含小写字母和数字字符,请编写一个函数,将字符串中的字母字符保持不变,而将每个数字字符替换为number。 例如,对于输入字符串 "a1b2c3",函数应该将其转换为 "anumberbnumbercnumber"。

输入描述

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

输出描述

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

输入示例

a1b2c3

输出示例

anumberbnumbercnumber

提示信息

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

class solution {
public:
	string convert(string & s)
	{
		//1.识别数字,扩容[number6位扣除数字1位]
		int i = 0;
		while (i<s.length())
		{
			if (s[i] >= '0' && s[i] <= '9')
			{
				int pi = s.length() - 1;
				//1.识别数字,扩容[number6位扣除数字1位],记录需要移动的次数
				int move = s.length()-1 - i;
				s.resize(s.length() + 5);
				//2.双指针,分别指向新老字符串的末尾,把待转化数字后面的字符搬到字符串尾部
				int pj = s.length() - 1;
				while (move--)
				{
					s[pj] = s[pi];
					pj--;
					pi--;
				}
				//3.放进number
				string tmp = "rebmun";
				for (int i = 0; i < 6; i++)
					s[pj - i] = tmp[i];
                //4.移动i
				i += 6;
			}
			else 
			i++;
		}
		return s;
		
	}
};

3. 右旋字符串(第八期模拟笔试)

时间限制:1.000S  空间限制:128MB

题目描述

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

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

输入描述

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

输出描述

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

输入示例

2
abcdefg

输出示例

fgabcde

提示信息

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

class solution {
public:
	void Reverse(string& s, int i, int j)
	{
		char c = 0;
		while (i < j)
		{
			c = s[i];
			s[i] = s[j];
			s[j] = c;
			i++;
			j--;
		}
	}
	string RightReverse(string& s,int k)
	{
		//先局部翻转,再总体翻转 原理表示如:A1B1A2B2->B1A1B2A2->A2B2A1B1
		int len = s.length();
		Reverse(s, 0, len - k - 1);
		Reverse(s, len - k, len - 1);
		Reverse(s, 0, len - 1);
		return s;
	}
};

4. KMP算法

//实现字符串的匹配(即在文本串中寻找模式串子串)
class KMP {
	int* next; //next数组含义:next[i]记录前i字符构成的子串中最长公共前后缀,指示模式串与文本串不匹配时模式串下一个比较字符
public:

	int KMP_Match(string s1 = "", string s2 = " ")
	{
		int* next = new int[s2.length()];
		getNext(s2, next);
		int i = 0, j = 0; //i遍历文本串,j遍历模式串
		for (int i = 0; i < s1.length(); i++)
		{
			while (j > 0 && s1[i] != s2[j]) {
				j = next[j - 1];
			}
			if (s1[i] == s2[j]) j++;
			if (j == s2.length())  //匹配
			{
				return i + 1 - s2.length();
			}
		}
		return -1;
	};

	void getNext(string s,int* next)
	{
		//i:前缀尾,j:后缀尾,注意 i指示当前最长公共前后缀的长度!!!
		//初始化
		if (!next)  next = new int[s.length()];
		next[0] = 0;  //next数组第一个位置设为0
		int i = 0, j;
		for ( j = 1; j < s.length(); j++){
		
			 //前后缀不匹配,循环前缀尾取上一个next的值,直至前后缀匹配或前缀到头
				while(i>0&&s[i]!=s[j])
				i = next[i - 1];  
				//前后缀匹配
				if (s[i] == s[j])
					i++; //公共前后缀长度加一
			
			next[j]=i;//更新next数组
		}

	}
};

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

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

相关文章

Vue.js+SpringBoot开发天沐瑜伽馆管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 瑜伽课程模块2.3 课程预约模块2.4 系统公告模块2.5 课程评价模块2.6 瑜伽器械模块 三、系统设计3.1 实体类设计3.1.1 瑜伽课程3.1.2 瑜伽课程预约3.1.3 系统公告3.1.4 瑜伽课程评价 3.2 数据库设计3.2.…

HTML—标签的分类,span和div标签,不同的标签之间类型转换

标签的分类&#xff1a; ①块级标签&#xff1a;无论内容多少&#xff0c;会充满整个行。大小可自定义 例&#xff1a;p&#xff0c;h1&#xff0c;ul&#xff0c;ol&#xff0c;hr 等 ②行级标签&#xff1a;自身的大小就是标签的大小&#xff0c;不会占一整行。大小不可调 例…

免费升级https的方式(含教学)

背景&#xff1a;随着现在全民网络安全意识的日益提升&#xff0c;各个网站实现的https数量也随之提升&#xff0c;那么如何将原本网站的http访问方式升级为https呢&#xff1f;下面均为干货内容。 目录 http访问和https访问的区别&#xff1a; 实现https后有哪些好处&#x…

多人聊天室 (epoll - Linux网络编程)

文章目录 零、效果展示一、服务器代码二、客户端代码三、知识点1.bind() 四、改进方向五、跟练视频 零、效果展示 一个服务器作为中转站&#xff0c;多个客户端之间可以相互通信。至少需要启动两个客户端。 三个客户端互相通信 一、服务器代码 chatServer.cpp #include <…

Java代码审计安全篇-反序列化漏洞

前言&#xff1a; 堕落了三个月&#xff0c;现在因为被找实习而困扰&#xff0c;着实自己能力不足&#xff0c;从今天开始 每天沉淀一点点 &#xff0c;准备秋招 加油 注意&#xff1a; 本文章参考qax的网络安全java代码审计和部分师傅审计思路以及webgoat靶场&#xff0c;记录…

续上篇 qiankun 微前端配置

上篇文章地址&#xff1a;微前端框架 qiankun 配置使用【基于 vue/react脚手架创建项目 】-CSDN博客 主应用&#xff1a; src/main.js 配置&#xff1a; import Vue from vue import App from ./App.vue import router from ./router import { registerMicroApps, start } …

paddle ocr识别文字

paddle使用 # pip install paddlepaddle2.5.2 -i https://mirror.baidu.com/pypi/simple # pip install paddleocr2.7.0.3 -i https://mirror.baidu.com/pypi/simplefrom paddleocr import PaddleOCR from PIL import Image import numpy as npimage Image.open(./2.png) ocr…

CentOS7 部署 k8s

准备两台虚拟机192.168.152.129192.168.152.130更改主机名192.168.152.129&#xff1a;hostnamectl set-hostname k8s-masterhostnamectl192.168.152.130&#xff1a;hostnamectl set-hostname k8s-node1hostnamectl master节点配置 1.配置hosts 在两台节点上执行vim /etc/h…

js【详解】ajax (含XMLHttpRequest、 同源策略、跨域、JSONP)

ajax 的核心API – XMLHttpRequest get 请求 // 新建 XMLHttpRequest 对象的实例 const xhr new XMLHttpRequest(); // 发起 get 请求&#xff0c;open 的三个参数为&#xff1a;请求类型&#xff0c;请求地址&#xff0c;是否异步请求&#xff08; true 为异步&#xff0c;f…

个人简历主页搭建系列-03:Hexo+Github Pages 介绍,框架配置

今天的更新内容主要是了解为什么选择这个网站搭建方案&#xff0c;以及一些前置软件的安装。 Why Hexo? 首先我们了解一下几种简单的网站框架搭建方案&#xff0c;看看对于搭建简历网站的需求哪个更合适。 在 BuiltWith&#xff08;网站技术分析工具&#xff09;上我们可以…

mybatis实现动态sql和关联映射以及延迟加载策略

一、动态sql的简述 什么是动态sql:在不同条件下拼接不同的sql Mybatis框架的动态sql技术是一种根据特定条件动态拼接SQl语句的功能&#xff0c;他存在的意义是为了解决拼接SQL语句字符串时的痛点问题。比如我们在用淘宝之类的软件在进行商品属性选择的时候&#xff0c;我们会发…

2024最新小狐狸AI 免授权源码

后台安装步骤&#xff1a; 1、在宝塔新建个站点&#xff0c;php版本使用7.2 、 7.3 或 7.4&#xff0c;把压缩包上传到站点根目录&#xff0c;运行目录设置为/public 2、导入数据库文件&#xff0c;数据库文件是 /db.sql 3、修改数据库连接配置&#xff0c;配置文件是/.env 4、…

Ubuntu20.04 部署 k8s

目前生产部署 Kubernetes 集群主要有两种方式 kubeadm Kubeadm是一个k8s部署工具&#xff0c;提供 kubeadm init 和 kubeadm join&#xff0c;用于快速部署 Kubernetes 集群。 kubeadm 是由 k8s 官方所提供的专门部署集群的管理工具。在每一个节点主机上都要手动安装并运行 …

OpenOFDM接收端信号处理流程

Overview — OpenOFDM 1.0 documentation 本篇文章为学习OpenOFDM之后的产出PPT&#xff0c;仅供学习参考。 ​​​​​​​

每日五道java面试题之springMVC篇(三)

目录&#xff1a; 第一题. Controller注解的作用第二题. RequestMapping注解的作用第三题. ResponseBody注解的作用第四题. PathVariable和RequestParam的区别第五题. Spring MVC与Struts2区别 第一题. Controller注解的作用 在Spring MVC 中&#xff0c;控制器Controller 负责…

Upload-labs靶场

文件漏洞上传进行复现 环境搭建--->搭建好环境如下&#xff1a; 打开第一关&#xff0c;尝试文件上传漏洞 根据界面提示&#xff0c;选择一个文件&#xff08;.php文件&#xff09;进行上传&#xff0c;发现无法上传 根据提示是指使用js对不合法文件进行了检查&#xff0c;…

蓝桥杯单片机快速开发笔记——DS18B20温度传感器

一、原理分析 考试时可能会需要自己编写底层驱动的.h文件&#xff0c;编写.h的关键是会查原理图把DQ定义好。 sbit DQ P1^4; 二、应用 温度监控&#xff1a;DS18B20广泛应用于温度监控系统中&#xff0c;如室内温度监测、工业生产过程中的温度控制等。 环境监测&#xf…

怎样提升小程序日活?签到抽奖可行吗?

一、 日活运营策略 小程序应该是即用即走的&#xff0c;每个小程序都在用户中有自己的独特定位&#xff0c;可能是生活日常必备&#xff08;美食、团购、商城&#xff09;&#xff0c;也可能是工作办公必备&#xff08;文档、打卡、工具&#xff09;。 如果你想要让自己的小程…

白话transformer(三):Q K V矩阵代码演示

在前面文章讲解了QKV矩阵的原理&#xff0c;属于比较主观的解释&#xff0c;下面用简单的代码再过一遍加深下印象。 B站视频 白话transformer&#xff08;三&#xff09; 1、生成数据 我们呢就使用一个句子来做一个测试&#xff0c; text1 "我喜欢的水果是橙子和苹果&…

WPF布局、控件与样式

视频来源&#xff1a;https://www.bilibili.com/video/BV1HC4y1b76v/ 布局 常用布局属性 HorizontalAlignment&#xff1a;用于设置元素的水平位置VerticalAlignment&#xff1a;用于设置元素的垂直位置Margin&#xff1a;指定元素与容器的边距Height&#xff1a;指定元素的…