数据结构----结构--线性结构--字符串
数据结构----结构–线性结构–字符串
一.字符串的定义方式
第一种:
char* str1="Hello"
第二种:
char str2[]="Hello";
区别
1.所在区域不同
//str1在常量区//str2在这里的写法是在栈区
2.元素是否可改
//str1中的元素不可改//str2中的元素可改//第一种
//用下标进行修改//第二种
//用strcpy函数进行修改
3.str1和str2是否可改
//str1可改,它是指针可以改变指向
str1="Haha";//str2不可改,它是地址不可改
4.大小不同
sizeof(str1);//4个字节sizeof(str2);//6个字节
二.关于字符串替换的问题
题目:
将一个足够长的字符串的空格替换成win,原字符串为 "only lovers left alive "(此字符串是无限长的 'e’字符后面有无限的空间)
方法:
1.暴力 申请一块新空间大小为 strlen(字符串)+额外要用的空间
对原字符串进行遍历,遇到空格就在新空间存入win,不是的话就存入原字符
时间复杂度 O(n) 空间复杂度 O(n)
2.字符串切割,拼接
切割的函数为strtok
连接的函数为strcat
时间复杂度 O(n) 空间复杂度 O(n)
3.栈 时间复杂度 O(n) 空间复杂度 O(n)
4.队列 时间复杂度 O(n) 空间复杂度 O(n)
5.暴力(优化)
1.在原有空间上定义两个指针
2.一个指向最后一个字符的位置,另一个指向替换完空格后的地方(此位置为strlen(字符串)+额外要用的空间)
3.两个指针同时向前移动,遇到空格,就在后面指针指向的位置替换成win(先替换n然后指针向前移动以此类推,直到替换完成),不是空格就把前面指针指向的位置的内容,替换到后面指针指向的位置,然后两个指针一起向前移动,直到前一个指针的下一个不是此字符串中的元素了。
时间复杂度 O(n) 空间复杂度 O(1)
三.关于字符串单词倒置的问题
题目:
将一个字符串 “only lovers left alive"进行单词倒置 倒置后的字符串为"alive left lovers only”
方法:
1.数组
定义两个指针,一个指向字符串从后往前第一个不为空格的字符,另一个最开始也是指向这里,然后向前遍历,当找到空格时,将这一段的字符全部都放到新的数组里,然后后面的指针来到第一个指针的位置,从此位置向前再次找到第一个不为空格的字符,之后另一个也指向这里,接着向前遍历,当找到空格时再将这一段的字符全部都放到新的数组里
两个指针一直重复上面的过程,直到前面指针指向了字符串中的首元素,看两个指针是否指向统一元素,如果不是就将这一段的字符全部都放到新的数组里倒置完成,如果是的话倒置完成。
时间复杂度 O(n) 空间复杂度 O(n)
2.倒置
先将整个字符串进行倒置,然后将每个单词进行倒置
时间复杂度 O(n) 空间复杂度 O(1)
3.链表
将每一个单词都用一个链表存,然后将链表从前到后采用头插法,变成一个新链表即可
时间复杂度 O(n) 空间复杂度 O(n)
4.栈
(1)一个栈+数组
将字符串入栈,如果遇到空格,就将栈内元素出栈放到数组中(数组提前申请好空间)
如果字符串为空了就将栈内元素出栈放到数组中
时间复杂度 O(n) 空间复杂度 O(n)
(2)两个栈
将字符串全部入到第一个栈中,然后将第一个栈中元素弹出,入到第二个栈中,
如果遇到空格,就将第二个栈中的元素,替换到原字符串的相应位置上(这里会有一个指针来进行字符的替换,每替换完一个,指针就向后移动一位,指针最开始指向字符串的首元素),然后进行将第一个栈中的元素弹出
直到第一个栈中没有元素了,如果第二个栈中有元素就将第二个栈中元素全部弹出,替换原字符串中的相应位置上
时间复杂度 O(n) 空间复杂度 O(n)
5.字符串切割,拼接
升级版于字符串单词倒置问题(此题的网址为https://leetcode.cn/problems/reverse-words-in-a-string/)
题目:
给你一个字符串 s
,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s
中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
**注意:**输入字符串 s
中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
运用到上面分析的倒置的方法代码如下:
//这里的代码是c++语言下的
class Solution {
public:string reverseWords(string s) {//删除首尾的空格s.erase(0, s.find_first_not_of(" "));s.erase(s.find_last_not_of(" ")+1);//整体进行翻转int begin1 = 0;int end1 = s.size() - 1;while (begin1 < end1) {char a = s[begin1];s[begin1] = s[end1];s[end1] = a;begin1++;end1--;}//每个单词进行翻转int begin = 0;int end = 0;char* p = &s[0];int index = 0;int bool1 = 1;int bool2 = 1;int bool3 = 0;int bool4 = 0;int bool5 = 0;while (*p != '\0') {if (*p != ' ' && *(p + 1) != ' '&&bool1%2==1) {begin = index;bool1++;bool3 = 1;}if ((*p == ' ' && *(p - 1) != ' ' && bool1 % 2 == 0)) {end = index - 1;bool1++;bool4 = 1;}if (*(p + 1) == '\0' && *p !=' ' && bool1 % 2 == 0) {end = index;bool1++;bool4 = 1;}int begin2 = begin;int end2 = end;while (begin2 < end2&& bool3&& bool4) {bool5 = 1;char a = s[begin2];s[begin2] = s[end2];s[end2] = a;begin2++;end2--;}if (bool5) {bool3 = 0;bool4 = 0;bool5 = 0;}p++;index++;}//去除字符串间的空格string::iterator ite = s.begin();while (ite!=s.end()) {if (*ite == ' ' && *(ite + 1) == ' ') {ite=s.erase(ite);}else if (*ite == ' ' && *(ite - 1) == ' ') {ite = s.erase(ite);}else {ite++;}}return s;}
};
四.关于字符串的一道题
题目:
一个字符串”abcdefgh“ ,输入一个k,将前k个字符移到字符串的后面,且移动的k个字符顺序不变,当k等于3时,移动后的字符串为”defghabc“
方法:
1.队列/栈
2.链表/数组
3.字符串切割,拼接
4.倒置
先将整个字符串进行倒置,然后将0 ~ 第k-1字符包括它们之间的字符进行倒置,将 k ~ 最后一个字符包括它们之间的进行倒置
时间复杂度 O(n) 空间复杂度 O(1)
五.关于字符串查找的问题
1.根据经验总结出下面四大查找问题
1.在一个串中找符合某个条件的字符
2.在一个串中找符合条件的某个串/某些串
3.在多个串中找某个串/某些串
4.在两个串中找符合条件的某些公共串
1.第一大查找问题中的题
题目:
找到第一个只出现一次的字符
解决:
1.队列+计数器
2.map+遍历
3.hash+遍历
2.第二大查找问题中的题
题目:
找到字符串中最长回文子串
解决:
1.判断一个字符串是否是回文子串,从中间断开,然后翻转后面的字符串,然后两个字符串进行对比,看是否相等即可
2.然后再比较长度即可
3.第二大查找问题中的KMP算法
1.KMP算法的作用
KMP算法是用来找一个串(字串)在另一个串(主串)中出现的位置(首元素的位置)
2.KMP的实现
1.首先定义一个Next数组用来存字串中每个元素前面串的前缀字串和后缀字串相同最大的长度
1.定义两个相邻变量作为下标
2.如果后面那个下标所在的元素和前一个下标在next数组中充当下标所找到的元素相同,则此元素所在下标的nexrt数组的值就是前一个元素下标在next数组中所找到元素的值+1
3.如果不相同且前一个元素下标在标在next数组中所找到元素的值为0,那么此元素所在下标的nexrt数组的值为0
4.如果不相同且前一个元素下标在标在next数组中所找到元素的值不为0,那前一个变量就变为它所在下标在next数组中充当下标所找到的值-1,然后重复操作2,直到找到,或者找到子串的头节点还没找到结束
2.子串与主串进行匹配
1.如果子串元素与主串元素相同,继续往下比
2.如果子串元素与主串元素不相同,那子串中的元素就变为当前元素下标前面那个的元素下标的Next数组的所指的子串元素,如果到了子串的头元素也不相等,那匹配串重头开始
3.直到子串遍历完了或者主串遍历完了,结束
3.KMP代码的如下
//此代码是使用c写的
#include<stdio.h>
#include<stdlib.h>int* GetNext(const char* match) {int* pNext = (int*)malloc(sizeof(int) * strlen(match));pNext[0] = 0;int i = 1;int j = i - 1;while (i < strlen(match)) {if (match[i] == match[pNext[j]]) {pNext[i] = pNext[j] + 1;i++;j = i - 1;}else if (pNext[j] == 0) {pNext[i] = 0;i++;j = i - 1;}else {j = pNext[j] - 1;}}return pNext;
} int KMP(const char* src, const char* match) {if (src == NULL || match == NULL) return -1;//获得Next数组int* pNext = GetNext(match);//匹配int i = 0;int j = 0;while (i < strlen(match) && j < strlen(src)) {if (src[i] == match[j]) {i++;j++;}else {//匹配串跳转if (j == 0) {i++;}else {j = pNext[j - 1];}}}if (j == strlen(match)){return i - j;}else {return -1;}
}int main() {printf("%d\n", KMP("abcabcgweu3abcabcdusabcabcsfh", "abcabc"));//测试样例return 0;
}
4.第二大查找问题中的Sunday算法
1.Sunday算法的作用
KMP算法是用来找一个串(字串)在另一个串(主串)中出现的位置(首元素的位置)
2.Sunday的实现
1.首先申请一个256个空间大小的inr型的数组Next(因为字符一共有256个,所以可以定义一个有限长度的数组)
1.申请完数组后将数组中的元素全部赋值为-1
2.遍历一遍子串,给数组中的元素进行赋值,存的是子串中每个元素在子串中从右往左第一次出现的下标
2.子串与主串进行匹配
1.定义两个变量用来遍历主串和子串,还有一个标记变量用来找每回主串与子串匹配来时的那个下标
2.主串与子串进行匹配,如果相同,那么继续下一个,如果不相同,那子串从头开始,主串则是从k所在下标加上子串长度然后减去当前所获得的字符在Next数组中充当下标的值开始
3.直到子串遍历完了或者主串遍历完了,结束
3.Sunday代码的如下
//此代码是使用c++写的
#include <iostream>
#include <string>
using namespace std;int Next[256];//申请一个Next数组,用来存匹配串中各个元素的下标void funzhi(string a) {//初始化Next数组for (int i = 0; i < a.size(); i++) {Next[a[i]] = i;}
}
int peidui(string zhu, string pi) {//进行配对int i = 0;//主串int j = 0;//匹配串int length = pi.size();//匹配串长度int k = 0;//用来标记匹配串在主串中首元素的下标while (1) {if (zhu[i] != pi[j]) {//如果主串元素与匹配串元素不相同if (k + length >= zhu.size()) {//如果超出了主串的范围return -1;}k = k + length - Next[zhu[k + length]];i = k;j = 0;}else {//如果主串元素与匹配串元素相同i++;j++;}if (j >= pi.size()) {//如果子串遍历完了return k;}}
}
相关文章:
数据结构----结构--线性结构--字符串
数据结构----结构–线性结构–字符串 一.字符串的定义方式 第一种: char* str1"Hello"第二种: char str2[]"Hello";区别 1.所在区域不同 //str1在常量区//str2在这里的写法是在栈区2.元素是否可改 //str1中的元素不可改//st…...

数据工厂-生成接口通用用例
章节目录: 一、背景介绍二、前置准备三、设计思路四、代码具体实现五、执行效果六、其他说明七、结束语 一、背景介绍 有哪些用例是可以通用且固定的? 针对之前提到的接口用例设计思路,拆分为三个切入点: 举个例子: {…...
N 字形变换
N 字形变换 题目: 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:P A H N A P L S I I G Y I R 之后,你的输…...

STM32+RTThread配置以太网无法ping通,无法获取动态ip的问题
记录一个非常蠢的问题,今天在移植rtthread的以太网驱动的时候出现无法获取动态ip的问题,问题如下: 设置为动态ip时不管是连接路由器还是电脑主机都无法ping通,也无法获取dns地址。 设置为静态ip时无法ping通主机。 使用wireshark…...

python编写MQTT订阅程序
Download | Eclipse Mosquitto 1、下载: https://mosquitto.org/files/binary/win64/mosquitto-2.0.17-install-windows-x64.exe 2、安装: 3、conf配置 1)使用notepad打开“C:\Program Files\mosquitto\mosquitto.conf”另存为c:\myapp\msquitto\mo…...
mysql 中 cast 函数用法
在 MySQL 中,CAST() 函数用于将一个表达式转换为指定的数据类型。它可以用于多种场景,例如将字符串转换为数字,或者将日期时间转换为特定格式。 以下是 CAST() 函数的基本语法: CAST(expression AS datatype) 其中,…...

MongoDB 的简介
MongoDB 趋势 对于 MongoDB 的认识 Q&A QA什么是 MongoDB? 一个以 JSON 为数据模型的文档数据库一个以 JSON 为数据模型的文档数据库文档来自于“JSON Document”,并非我们一般理解的 PDF,WORD谁开发 MongDB? 上市公司 MongoD…...

是否在业务中使用大语言模型?
ChatGPT取得了巨大的成功,在短短一个月内就获得了1亿用户,并激发了企业和专业人士对如何在他们的组织中利用这一工具的兴趣和好奇心。 但LLM究竟是什么,它们如何使你的企业受益?它只是一种炒作,还是会长期存在? 在这篇文章中我…...

37. 交换字符(第三期模拟笔试)
题目: 给定一个01串(仅由字符0和字符1构成的字符串)。每次操作可以交换两个相邻的字符。 例如:对于字符串"001110"来说, 可以交换第二个字符0和第三个字符1,交换之后的字符串变成了"0101…...

git 查看当前分支最近一次提交的commit SHA
获取当前分支最近一次commit SHA (长度为40个16进制数字的字符)命令如下: git rev-parse HEAD 获取简写(短) commit SHA git rev-parse --short HEAD...

LuatOS 开发指南
NDK 开发 官方教程 官方例程 API 下载软件 下载官方NDK例程压缩包到本地,并解压。可以看到目录如下: doc: 文档教程 env: 编译环境 example: NDK示例 platform: 需要编译的平台(air72x/air8xx) tools: 其他辅助软件 VSCode 使…...

maven推包The environment variable JAVA_HOME is not correctly set
解决办法: 打开idea查看jdk安装位置 1.在/etc下面创建(如果存在就是更新)launchd.conf。里面添加一行: setenv JAVA_HOME /Library/Java/JavaVirtualMachines/jdk1.8.0_351.jdk/Contents/Home #JAVA_HOME后面是我的java安装路径…...

Python VScode 配置
在上一章节中我们已经安装了 Python 的环境,本章节我们将介绍 Python VScode 的配置。 准备工作: 安装 VS Code安装 VS Code Python 扩展安装 Python 3 安装 VS Code VSCode(全称:Visual Studio Code)是一款由微软…...

【vue2第九章】组件化开发和根组件以及style上的scoped作用
组件化开发和根组件 什么是组件化开发? 一个页面可以拆分为多个组件,每个组件有自己的样式,结构,行为,组件化开发的好处就是,便于维护,利于重复利用,提升开发的效率。 便于维护&…...

从零开始的Hadoop学习(五)| HDFS概述、shell操作、API操作
1. HDFS 概述 1.1 HDFS 产出背景及定义 1)HDFS 产生背景 随着数据量越来越大,在一个操作系统存不下所有的数据,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切 需要一种系统来管理多台机器上的…...
【spark】序列化和反序列化,transient关键字的使用
序列化 Spark是基于JVM运行的进行,其序列化必然遵守Java的序列化规则。 序列化就是指将一个对象转化为二进制的byte流(注意,不是bit流),然后以文件的方式进行保存或通过网络传输,等待被反序列化读取出来。…...
2.4 Vector<T> 动态数组(随机访问迭代器)
C自学精简教程 目录(必读) 该 Vector 版本特点 这里的版本主要是使用模板实现、支持随机访问迭代器,支持std::sort等所有STL算法。(本文对随机迭代器的支持参考了 复旦大学 大一公共基础课C语言的一次作业) 随机访问迭代器的实现主要是继承std::iterator<std:…...
Ubuntu下运行QEMU模拟riscv64跑Debian
1.安装QEMU 下载地址: https://www.qemu.org/download/ 建议选择稳定版本,下载后解压,然后make wget https://download.qemu.org/qemu-8.0.3.tar.xz tar xjvf qemu-8.0.3.tar.xz cd qemu-8.0.3 ./configure --enable-kvm --enable-virtfs …...

移动基站ip的工作原理
原理介绍 Basic Principle 先说一下概念,大家在不使用 WIFI 网络的时候,使用手机通过运营商提供的网络进行上网的时候,目前都是在用户端使用私有IP,然后对外做 NAT 转换,这样的情况就导致大家统一使用一些 IP 段进行访…...

Kubernetes技术--使用kubeadm搭建高可用的K8s集群(贴近实际环境)
1.高可用k8s集群架构(多master) 2.安装硬件要求 一台或多台机器,操作系统 CentOS7.x-86_x64 硬件配置:2GB或更多RAM,2个CPU或更多CPU,硬盘30GB或更多 注: 这里属于教学环境,所以使用三台虚拟机模拟实现。 3.部署规划 4.部署前准备 (1).关闭防火墙 systemctl stop fi…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)
考察一般的三次多项式,以r为参数: p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]; 此多项式的根为: 尽管看起来这个多项式是特殊的,其实一般的三次多项式都是可以通过线性变换化为这个形式…...