数据结构----结构--线性结构--字符串
数据结构----结构–线性结构–字符串
一.字符串的定义方式
第一种:
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…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...

如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
加密通信 + 行为分析:运营商行业安全防御体系重构
在数字经济蓬勃发展的时代,运营商作为信息通信网络的核心枢纽,承载着海量用户数据与关键业务传输,其安全防御体系的可靠性直接关乎国家安全、社会稳定与企业发展。随着网络攻击手段的不断升级,传统安全防护体系逐渐暴露出局限性&a…...