数据结构----结构--线性结构--字符串
数据结构----结构–线性结构–字符串
一.字符串的定义方式
第一种:
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…...
【Linux】文件
Linux 文件 什么叫文件C语言视角下文件的操作文件的打开与关闭文件的写操作文件的读操作 & cat命令模拟实现 文件操作的系统接口open & closewriteread 文件描述符进程与文件的关系重定向问题Linux下一切皆文件的认识文件缓冲区缓冲区的刷新策略 stuout & stderr 什…...
Android OTA 相关工具(六) 使用 lpmake 打包生成 super.img
我在 《Android 动态分区详解(二) 核心模块和相关工具介绍》 介绍过 lpmake 工具,这款工具用于将多个分区镜像打包生成一个 Android 专用的动态分区镜像,一般称为 super.img。Android 编译时,系统会自动调用 lpmake 并传入相关参数来生成 sup…...
信创环境 Phytium S2500 虚拟机最大内存规格测试
在 ARM 架构中,"IPA" 通常指的是 "Instruction Set Architecture"(指令集架构),arm环境的虚拟机支持的最大内存规格与母机上内存多少无关,由arm本身的ipa size决定,ipa size 可以理解为虚拟机的物理地址空间,kernel5.4.32中ipa默认是44bits(16T si…...
新建工程——第一个S32DS工程
之前的"测试开发板"章节 测试开发板——第一个AutoSAR程序,使用了一个 demo 工程,不管是裸机程序还是 AutoSAR 程序,那都是别人已经创建好的工程。本节来介绍如何来创建自己的工程,本节介绍如何创建一个 S32DS 的工程,点亮开发板上的 LED 我们从官方提供的例程…...
基于Open3D的点云处理16-特征点匹配
点云配准 将点云数据统一到一个世界坐标系的过程称之为点云配准或者点云拼接。(registration/align) 点云配准的过程其实就是找到同名点对;即找到在点云中处在真实世界同一位置的点。 常见的点云配准算法: ICP、Color ICP、Trimed-ICP 算法…...
设计模式—简单工厂
目录 一、前言 二、简单工厂模式 1、计算器例子 2、优化后版本 3、结合面向对象进行优化(封装) 3.1、Operation运算类 3.2、客户端 4、利用面向对象三大特性(继承和多态) 4.1、Operation类 4.2、加法类 4.3、减法类 4…...
真机安装Linux Centos7
准备工具: 8G左右U盘最新版UltraISOCentOS7光盘镜像 操作步骤 下载镜像 地址:http://isoredirect.centos.org/centos/7/isos/x86_64/ 安装刻录工具UltraISO,刻录镜像到U盘 ① 选择ISO镜像文件 ② 写入磁盘镜像,在这里选择你的U盘…...
ceph peering机制-状态机
本章介绍ceph中比较复杂的模块: Peering机制。该过程保障PG内各个副本之间数据的一致性,并实现PG的各种状态的维护和转换。本章首先介绍boost库的statechart状态机基本知识,Ceph使用它来管理PG的状态转换。其次介绍PG的创建过程以及相应的状…...
Java | File类
目录: File类File类中常用的方法:boolean exists( ) :判断此 文件/目录 是否存在boolean createNewFile( ) :创建一个文件boolean mkdir( ) :创建 “单层” 目录/文件夹boolean mkdirs( ) :创建 “多层” 目…...
数学建模之灰色预测
灰色预测(Grey Forecasting)是一种用于时间序列数据分析和预测的方法,通常用于处理具有较少历史数据的情况或者数据不够充分的情况。它是一种非常简单但有效的方法,基于灰色系统理论,用来估计未来的趋势。 以下是灰色…...
网站域名使用怎么做分录/全球疫情最新数据消息
1 在linux命令行底下通过python -V查看python版本号suiycsuiyc-A76GMV:~/sycworkspace/simple-sample$ python -V 2>&1 | awk {print $2}输出结果示例:2.7.32 直接在命令行中输入python示例:suiycsuiyc-A76GMV:~/sycworkspace/simple-sample$ pyt…...
苹果cms做的影视网站/网站推广和优化的原因
优秀学员统计 题目 公司某部门软件教导团正在组织新员工每日打卡学习活动,他们开展这项学习活动已经一个月了,所以想统计下这个月优秀的打卡员工。每个员工会对应一个 id,每天的打卡记录记录当天打卡员工的 id 集合,一共 30 天。 请你实现代码帮助统计出打卡次数 top5 的…...
武汉网站服务/上海网络推广招聘
1、下载MongoDb https://www.mongodb.com/try/download/community 安装很简单、基本都是下一步。安装好需要进行环境变量的配置、在path里面吧对应的bin路径加入到里面D:\mongodb-win32-x86_64-2012plus-4.2.23\bin 2、集成 配置YML spring:data:mongodb:host: localhostport:…...
乐清做网站建设/如何找外包的销售团队
网址栏输入 Chrome 黑色模式指令: chrome://flags/#enable-force-darkdefault——默认白色 enabled——启用黑色...
找别人做网站 自己管理/app开发公司排行榜
周五下午面试4399,4399的前台妹子确实给力,刚进去的时候应该赶上校招吧,比较多的应届生来面试,前台妹子给了我一张面试申请表给我填了,填完之后,过了段时间正式进入面试,面试的过程整个比较融洽…...
仿爱范儿网wordpress主题/seo服务外包公司
以前写过一个沉浸式状态栏 的实现方式 Android 沉浸式状态栏 实现方式一 现在有个更为简单的实现方式 。 相关链接 http://www.apkbus.com/forum.php?modviewthread&tid255929&extrapage%3D3%26filter%3Dsortid%26orderby%3Ddateline%26sortid%3D12 1、效果图 demo 的…...