字符串及相关算法

数据结构——字符串 一、标准字符串 字符串(string)是由零个或多个字符组成的有限序列。 字符串的比较是通过组成字符串的字符之间的编码来进行的,而字符的编码指的是字符在对应字符集中的序号(即ASCII值)。 字符串的常见操作有: (1)将字符串指定为给定值; (2)将给定字符串复制到另一字符串; (3)清空字符串字符; (4)判断字符串是否为空; (5)返回字符串的长度; (6)比较两个字符串; (7)将两个字符串拼接成一个新的字符串; (8)提取字符串的一部分作为新的字符串; (9)在一个字符串中查找另一个给定字符串是否 阅读详情

串的介绍

串型结构就是由若干个类型相同的元素组成的数据结构,末尾有一个结束标志,字符串就是由字符元素组成的串型结构,'\0'是它的结束标志,使用它可以存储单词、文章、汉字等文字信息。

随着计算机和编程语言的发展,字符串在程序中使用的越来越多,字符串就简称串,对它的操作都是对串里面所有字符整体操作,以'\0'为结束标志,如果字符串的末尾没有'\0',可能会产生乱码、段错误、脏数据等问题。

1、字符串结构应该具备的功能、算法有:

创建:定义字符串

销毁:释放字符串

清空:删除所有的字符

复制:就是strcpy函数

连接:就是strcat函数

比较:就是strcmp函数

长度:就是strlen函数

查询字串:就是strstr函数

2、字符串的表示与实现

字符串一般有两实现方式,这两种方式都是使用顺序表,只是内存不同而已:

1、用栈内存存储字符,定长方式,字符的数量一旦超出表的范围,为了防止内存越界要对字符串进行截取,了解一下即可。

2、使用堆内存破碎字符,在操作字符串时,自动扩展堆内存。

#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
#include <string.h>

typedef struct String
{
	char* ch;
	size_t size;
}String;

// 创建字符串
String* create_string(void)
{
	String* str = malloc(sizeof(String));
	str->ch = NULL;
	str->size = 0;
	return str;
}

// 计算长度
size_t len_string(String* str)
{
	return strlen(str->ch);
}

// 复制
void copy_string(String* str,const char* ch)
{
	size_t size = strlen(ch)+1;
	if(size > str->size)
	{
		str->ch = realloc(str->ch,size);
		str->size = size;
	}
	
	strcpy(str->ch,ch);
}

// 构建字符串
String* assign_string(const char* ch)
{
	String* str = create_string();
	copy_string(str,ch);
	return str;
}

// 判断是否是空串
bool empty_string(String* str)
{
	return NULL == str->ch;
}

// 赋值
void sav_string(String* str1,String* str2)
{
	if(str1->size < str2->size)
	{
		str1->ch = realloc(str1->ch,str2->size);
		str1->size = str2->size;
	}

	strcpy(str1->ch,str2->ch);
}

// 比较
int cmp_string(String* str1,String* str2)
{
	return strcmp(str1->ch,str2->ch);
}

// 连接
void cat_string(String* str1,String* str2)
{
	size_t size = strlen(str1->ch)+strlen(str2->ch)+1;
	if(size >= str1->size)
	{
		str1->ch = realloc(str1->ch,size);
		str1->size = size;
	}
	strcat(str1->ch,str2->ch);
}

// 清空字符串
void clear_string(String* str)
{
	free(str->ch);
	str->size = 0;
}

// 销毁字符串
void destroy_string(String* str)
{
	free(str->ch);
	free(str);
}

int main(int argc,const char* argv[])
{
	/*
	String* str1 = assign_string("hehe");
	String* str2 = create_string();
	// 浅拷贝,两个对象的ch指向了同一个字符串,当其它对象被销毁,另一个会受影响
	*str2 = *str1; // str2->ch = str1->ch; str2->len = str1->len;
	destroy_string(str1);
	puts(str2->ch);
	// 深拷贝,如果结构体中有成员是指针类型,且指向了堆内,这种结构变量不能直接赋值(浅拷贝),为了不出问题,我们需要实现深拷贝
	sav_string(str2,str1);
	destroy_string(str1);
	puts(str2->ch);
	*/
	String* str1 = assign_string("hehe");
	String* str2 = assign_string("xixi12rfaspoikjrqw;elifkj;lasejkrf;oawlikeujf;olaeirjtfasldkjf;qlwiejfa;sldkjf;qwlsekjfa;sldkfj;l");
	cat_string(str1,str2);
	puts(str1->ch);

	return 0;
}

3、封装字符串的意义

1、字符串被封装成数据结构后,使用者不需要关心字符串的空间问题,但这种封装在C语言下没有太大意义,因为C语言语法的原因会使用字符串操作更麻烦。

2、我们在C++语言中重写该数据结构,因为C++的语法会让该数据结构使用起来更方便。

4、子串查询的算法

假定有两个字符串str1,str2,查询子串就是在字符串str1中查询是否存在str2,如果存在则返回str2首次出现的位置,这个操作叫子串查询。

char *str_str(const char *str1, const char *str2)
{
	assert(NULL != str1 && NULL != str2);
	for (int i = 0, j; '\0' != str1[i]; i++)
	{
		for (j = 0; '\0' != str2[j] && str2[j] == str1[i + j]; j++)
			;
		if ('\0' == str2[j])
			return (char *)str1 + i;
	}
	return NULL;
}

char *str_str(const char *str1, const char *str2)
{
	assert(NULL != str1 && NULL != str2);
	int i = 0, j = 0;
	while ('\0' != str1[i] && '\0' != str2[j])
	{
		if (str1[i] == str2[j])
		{
			i++;
			j++;
		}
		else
		{
			i = i - j + 1;
			j = 0;
		}
	}
	return '\0' == str2[j] ? (char *)str1 + i - j : NULL;
}

char* str_str(const char* str1,const char* str2)
{
	assert(NULL != str1 && NULL != str2);
	int sum1 = 0 , sum2 = 0 , len = 0;
	while('\0'!=str2[len]&&'\0'!=str1[len])
	{
		sum1 += str1[len];
		sum2 += str2[len++];
	}

	for(int i=len; '\0' != str1[i]; i++)
	{
		printf("%d %d\n",sum1,sum2);
		if(sum1 == sum2 && 0 == strncmp(str1+i-len,str2,len))
		{
			return (char*)str1+i-len;
		}
		else
		{
			sum1 -= str1[i-len];
			sum1 += str1[i];
		}
	}

	return NULL;
}

字符串相关的算法整理 本文根据个人学习过程,积累一些常用知识。供后续参考学习。 字符串的相关的算法,一直是面试和项目中经常用到的。因此,在这里整理记录。字符串可以看成是字符类型的数组,因此可以将其和数组排序、数组查找和顺序调整有关的算法相结合。另外,字符串的比较和子字符串的操作,可以用来解决其他问题,比如一棵树是否和另一棵树的子树相匹配。 字符串操作包含很多基本知识点,如:回文的概念、字符匹配的问题、字典序问题、子 阅读详情

相关推荐

Apache Hop集成Spring Boot实战:从配置到执行HPL文件

本文详细介绍了将Apache Hop集成到Spring Boot应用中的完整实战方案。通过配置核心依赖、初始化Hop环境、编写服务层逻辑,实现了在Java应用中程序化执行HPL管道文件,从而将可视化ETL能力无缝嵌入微服务架构,提升数据处理的自动化与可维护性。

blue42的博客 477

数据结构-字符串详解

1、字符串要单独用一种存储结构来存储,称为串存储结构。这里的串指的就是字符串。2、对一些特殊的串进行的命名,比如说:空串:存储 0 个字符的串,例如 S = ""(双引号紧挨着);空格串:只包含空格字符的串,例如 S = " "(双引号包含 5 个空格);子串和主串:假设有两个串 a 和 b,如果 a 中可以找到几个连续字符组成的串与 b 完全相同,则称 a 是 b 的主串,b 是 a 的子串。注意:空格串和空串不同,空格串中含有字符,只是都是空格而已。...

有朋自远方来,不亦乐乎。 4692

《全连接到卷积神经网络:图像识别的演变历程》

这篇文章会从传统全连接层面临的困境说起,揭示卷积神经网络(CNN)成为图像识别核心动力的原因,探究其背后蕴含的设计思想与技术创新。但是回顾历史,CNN的出现提醒我们:技术的突破往往是由对自然规律的模仿和重新构建得来的。也许,当机器真的学会“像人一样看世界”的时候,它们的“眼睛”早就超过生物视觉的限制了。例如,用5×5的核处理224×224的输入时,只要25个参数(而不是全连接那种百万级的)。* 局部性:网络的底层只需留意局部的地方(像边缘、纹理这样的地方),不用管那些全局像素之间复杂的关系。

2401_82434295的博客 674

c语言实现基本的数据结构(六) 串

#include <stdio.h> #include <tchar.h> #include <stdlib.h> // TODO: 在此处引用程序需要的其他头文件 struct String{ char* ch; int length; }; bool Assign_String(String* ...

angmaodie3396的博客 517

Synopsys工具filter命令:从数据筛选到高效IC设计的实战指南

在数字集成电路设计流程中,数据筛选与查询是工程师处理海量网表、时序报告和设计约束的核心需求。其原理在于通过声明式查询语言,直接对设计对象(如单元、网络、路径)的属性进行逻辑判断与模式匹配,从而精准定位目标。这种技术价值在于将工程师从繁琐的过程式脚本循环中解放出来,大幅提升代码可读性与运行效率,直接调用工具内置的高性能查询引擎。在实际应用场景中,它广泛用于物理与时序联合分析、层次化模块操作、动态约束生成以及自动化报告生成。本文聚焦于Synopsys工具链中filter命令的高阶用法,深入解析其表达式语法、正则

weixin_28007513的博客 577

一代测序、二代测序以及三代测序的优缺点及应用对比?

一、初现庐山真面目 一代测序:又称Sanger测序(多分子,单克隆) 历史:第一代DNA测序技术(又称Sanger测序)在1975年,由Sanger等人开创,并在1977年完成第一个基因组序列(噬菌体X174),全长5375个碱基。研究人员经过30年的实践并对技术及测序策略的不断改进(如使用了不同策略的作图法、鸟枪法),2001年完成的首个人类基因组图谱就是以改进了的Sanger法为其测序基础。 原理:在4个DNA合成反应体系(含dNTP)中分别加入一定比例带有标记的ddNTP(分为:ddATP...

wangprince2017 3万+

数据结构学习笔记——字符串

串(string)是由零个或多个字符组成的有限序列,又名叫字符串。一般记为 s= “a1a2a3…an”(n >= 0)。串中的字符数目n称为串的长度,零个字符的串称为空串(null string)。空格串,只包含空格的串。注意它与空串的区别,空格串是有内容有长度的,而且可以不止一个空格。子串和主串,串中任意个数的连续字符组成的子序列称为该串的子串,相应地,包含子串的串称为主串。子串在主串中的位置就是子串的第一个字符在主串的序号。

weixin_43268649的博客 1068

CISSP背书三次失败后的终极解决方案

本文分享了作者CISSP认证三次线上背书审核失败的经历与终极解决方案。针对(ISC)²官方审核的严格性,文章详细剖析了使用公积金证明、工作证明盖章签字等常见材料的误区,并最终提出了通过构建“官方邮件往来”证据链的核心策略,以动态、可验证的方式成功通过审核,为后来者提供了详实的避坑指南和实操清单。

weixin_29219539的博客 154

数据结构(字符串)

详细介绍与数据结构相关的字符串类的构建与使用,含有具体实例供参考实验

weixin_60535956的博客 1244

新手秒变高手:使用一键脚本快速安装OpenClaw并完成初始化配置

一键脚本是一种自动化工具,可以帮助用户快速完成软件的安装和配置过程,无需手动执行繁琐的命令。OpenClaw提供了官方的一键安装脚本,让新手用户也能轻松部署OpenClaw。

一键难忘的博客 359

第十届MathorCup高校数学建模挑战赛-B题:养老服务床位需求预测与运营模式研究

当养老床位数增加时存在的商机,提出了相应的养老服务床位的运营商业模式。就业的可能性,建立多目标规划模型,尽可能同时满足三方面的要求。务床位的需求、制定合理的养老服务床位发展规划,是构建和谐社会、幸福社会。问题一的床位需求与市场类型的分类结果,查找关于国内养老院的相关数据,探。求,又能持续发展养老事业,同时还能促进社会就业的养老服务床位运营的商业。养老服务床位数的增加能够带来的就业方面因素的影响,并对这些因素进行一个。你们的模型及其结论为科学依据,对政府管理部门针对养老床位规划提出合理的。

getusushu的博客 1140

【算法】字符串相关

字符串是一种数据结构,大多与别的算法结合在一起出题,例如模拟、高精度算法、双指针、dp、回溯等,因此这个专题的题型本身是特别丰富的。本篇选取了较为典型的字符串题型,除了涵盖一些常用算法,还包括经常用到的容器、接口等。

NeeEk0的博客 1156

天地图下载带审图号(审图号: GS(2024)0650号)的 “行政区划” 数据(含shp文件下载地址)

在科研投稿论文过程中,多数期刊杂志要求我们制作涉及国界的图件,必须使用自然资源部地图技术审查中心发布的标准地图底图。如地理学报、地理科学等期刊的投稿指南中写到:非标准底图本刊不予发表!(如图1.1所示)如果一定要用,凡涉国界图件(国内部分地区、全国、世界部分地区、全球)必须使用自然资源部标准地图服务系统标准地图底图(http://bzdt.ch.mnr.gov.cn/)(如图1.1所示)或国家测绘局地理信息局标准地图底图(如图1.2所示),所用底图边界要完全无修改(包括南海诸岛位置)。

JData_Engineer的博客 2304

字符串相关算法

整体思路就是模拟列竖式计算两个数相乘的过程。但是为了书写代码的方便性,我们选择优化的版本,就是在计算两数相乘的时候,先不考虑进位,等到所有结果计算完毕之后,再去考虑进位。

2302_77179144的博客 634

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

C++ 字符串相关算法总结

字符串相关的算法 字典树 何为字典树 在n个字符串中查找某个字符串,就像用英语字典查单词一样 先翻第一个字母,然后是第二个,然后是第三个 查找任意单词,查找次数最多只需要这个单词的字母个数 实现与功能 根节点不包含字符,除根节点以外每个子节点都只包含一个字符 从根节点到某一个节点,路径上的字符连接起来,为该节点对应的字符串 每个节点的所有子节点包含的字符互不相同 通常在结点设置一个标志来标记该节点...

qq_43826794的博客 908

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

字符串相关算法题

3. 无重复字符的最长子串

朱嫑膘的博客 316

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

你不懂的字符串相关算法都在这里!

真正搞透字符串常用办法,懂你的一些奇奇怪怪的疑惑点。

weixin_57140993的博客 2276

算法学习【3】字符串相关含KMP算法

面试经常会考察String相关问题,现把相关题目整理如下: 1、返回逆序字符串,如,"abc"->"cba",要求空间复杂度为O(1)      思路:首尾字符依次交换 public static char[] inverseOrder(char[] str, int st, int fh){ int len = fh-st+1; char temp; for(int i=0;i

tiandawangliang的专栏 701

18 道 Java 字符串相关算法题思路简介及代码实现

字符串(String)相关的问题占据着举足轻重的地位。这是因为字符串作为基本的数据类型之一,广泛应用于各类编程场景,包括但不限于数据传输、文件处理、用户界面展示、数据库操作、网络通信等。熟练掌握字符串操作不仅是日常编程工作的必备技能,也是评估面试者编程基础、逻辑思维和问题解决能力的重要依据

zp8126的专栏 1737

字符串相关操作、问题及算法提纲

这两天leetcode做完了三分之一,开始遇到瓶颈了,二叉树、链表

sdadssa1的专栏 384

【LeetCode算法成长之路】Java字符串相关类总结与经典题目分析

本文小新为大家带来 Java字符串相关类总结与经典题目分析 相关知识,具体内容包括不可变字符序列String介绍(包括:String 的特性,构造器,String 与其他结构间的转换,基本常用方法,查找方法,字符串截取方法,开头与结尾判断方法,替换方法),可变字符序列StringBuffer与StringBuilder(包括:StringBuffer 与 StringBuilder 的理解,StringBuilder,StringBuffer 的 API)及相关经典题目进行详尽介绍~

小新要变强的博客 3168

String字符串相关算法

例一 题目描述: 判断字符串里括号是否成对出现 import java.util.HashMap; import java.util.Map; import java.util.Stack; public class matchJudger { // pair以右括号为key, 左括号为值 private Map<Character, Character> pa...

weixin_44212308的博客 260

【C++】字符串的基本操作和相关算法题

思路一、问题背景二、字符串的插入、删除和追加操作详解【C++】三、相关算法题【C++】 一、问题背景   首先来说字符串问题是十分经典的类型,我们经常会遇到输入是字符串的题目,然后利用各种STL标准库或者是一些动态规划的方法来求解问题,再或者是一些字符串遍历的一些技巧来提高效率等等,下边将介绍C++中相关的字符串常用操作函数以及我们可能常会遇到的算法问题。 二、字符串的插入、删除和追加操作详解【C++】 1. 字符串的插入(Insert函数) 1)在字符串s1的第p(从0开始数)个位置前插入字符串s2:s1

郝同学的博客 2469
上一篇: 队列结构的链式表示与实现
下一篇: 十大排序算法(C语言代码)
swewing
博客等级 码龄4年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值