当前位置: 首页 > news >正文

串的基本操作--数据结构

目录

一、串的基本概述

二、串的存储结构

2.1定义属性存储结构

串长有两种表示方法: 

1、用一个额外的变量length来存放串的长度;

2、串值后面加一个不计入串长的结束标记字符“\0”,此时的串长为隐含值。 

2.2堆的顺序存储结构  

三、串的基本操作 

3.1在模式串中pos位置查找长度为len的子串

 3.2直接返回模式串的长度

 3.3比较两个字符串之间的大小长短

 3.4朴素模式匹配算法

原文 


一、串的基本概述

  • 串是由零个或多个字符组成的有限序列;
  • 串中任意个连续的字符组成的子序列称为该串的子串,包含子串的串相应地称为主串;
  • 子串在主串中的位置以子串的第一个字符在主串中的位置来表示;
  • 当两个串的长度相等且每个对应位置的字符都相等时,称这两个串是相等的;
  • 一个或多个空格(空格是特殊字符)组成的串称为空格串,其长度为串中空格字符的个数。


二、串的存储结构


存储结构:顺序存储与链式存储。考虑到存储效率和算法的方便性,串多采用顺序存储结构。

类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。在串的定长顺序存储结构中,为每个串变量分配一个固定长度的存储区,即定长数组。

2.1定义属性存储结构

串长有两种表示方法: 
1、用一个额外的变量length来存放串的长度;
2、串值后面加一个不计入串长的结束标记字符“\0”,此时的串长为隐含值。 

我们这里采用方法1

​#define MAX_SIZE 25  //预定义最大串长为255
typedef struct{
    char ch[MAX_SIZE];   //每个分盘存储一个字符
    int length;         //串的实际长度
}SString;

2.2堆的顺序存储结构  

// 堆的顺序存储结构
struct HString{
    char *ch;     //按串长分配存储区,ch指向串的基地址
    int length;   //串的长度
} ;

三、串的基本操作 

3.1在模式串中pos位置查找长度为len的子串

//求子串
bool SubString(SString& Sub, SString S, int pos, int len) {
	if (pos + len - 1 < S.length) {
		return false;
	}
	for (int i = pos; i < pos + len; i++) {
		Sub.date[i] = S.date[i];
	}
	Sub.length = len;
}

 3.2直接返回模式串的长度

//求字符串长度
int length(SString S) {
	return S.length;
}

 3.3比较两个字符串之间的大小长短

//比较操作
bool compare(SString a,SString b) {
	for (int i = 0; i < a.length & i < b.length; i++) {
		if (a.date[i] != b.date[i]) {
			return a.date[i] - b.date[i];
		}
	}
	return a.length - b.length;
}

 3.4朴素模式匹配算法

//定位操作
int index(SString a, SString b) {
	SString Sub;
	int i = 1;
	int n = length(a), m =length(b);
	while (i <= n - m + 1) {
		SubString(Sub, a, i, m);
		if (compare(Sub, b) == 0)return i;
	}
	return 0;
}

原文 

#include<bits/stdc++.h>
using namespace std;
#define MAX_SIZE  23
struct SString {
	char date[MAX_SIZE];
	int length;
};
//求子串
bool SubString(SString& Sub, SString S, int pos, int len) {
	if (pos + len - 1 < S.length) {
		return false;
	}
	for (int i = pos; i < pos + len; i++) {
		Sub.date[i] = S.date[i];
	}
	Sub.length = len;
}
//比较操作
bool compare(SString a,SString b) {
	for (int i = 0; i < a.length & i < b.length; i++) {
		if (a.date[i] != b.date[i]) {
			return a.date[i] - b.date[i];
		}
	}
	return a.length - b.length;
}
//求字符串长度
int length(SString S) {
	return S.length;
}
//定位操作
int index(SString a, SString b) {
	SString Sub;
	int i = 1;
	int n = length(a), m =length(b);
	while (i <= n - m + 1) {
		SubString(Sub, a, i, m);
		if (compare(Sub, b) == 0)return i;
	}
	return 0;
}
//在主串里面查找模式串
int index2(SString a, SString b) {
	int i, j = 1;
	while (i <= length(a) && j <= length(b)) {
		if (a.date[i] == b.date[j]) {
			i++;
			j++;
		}
		else {
			i = i - j + 2;
			j = 1;
		}
	}
	if (j > length(b))return i-length(b);
	else return 0;
}

相关文章:

  • 算法日常刷题笔记(1)
  • 【数据分享】1929-2024年全球站点的逐日降雪深度数据(Shp\Excel\免费获取)
  • vLLM专题(二):安装-CPU
  • Retrofit+OkHttp+ViewModel
  • Go入门之语言变量 常量介绍
  • MongoDB 7 分片副本集升级方案详解(上)
  • CentOS 8 配置bond
  • C# 入门简介
  • Flutter 中的数据跨层传递方案
  • Qt之线程的创建与启动
  • 【JAVA工程师从0开始学AI】,第四步:闭包与高阶函数——用Python的“魔法函数“重构Java思维
  • 深入理解同步与异步I/O:从原理到实战
  • vue 判断字符串开头是http或者https
  • 2025-2-17算法打卡
  • 使用神经网络对驾驶数据进行道路类型分类
  • 《RCooper: 一个真实世界的大规模道路边协同感知数据集》学习笔记
  • C#异步/多线程编程中Task对象强大的功能介绍。
  • 三、tsp学习笔记——屏幕移植
  • UDP与TCP
  • Qt——连接MySQL数据库之ODBC的方法详细总结(各版本大同小异,看这一篇就够了)
  • 殷墟出土鸮尊时隔50年首次聚首,北京新展“看·见殷商”
  • 以色列在加沙发起新一轮强攻,同步与哈马斯展开无条件谈判
  • 盐城经济技术开发区党工委书记王旭东接受纪律审查和监察调查
  • 湖南4个县市区被确定为野生蘑菇中毒高风险区:中毒尚无特效解毒药
  • 海昏侯博物馆展览上新,“西汉帝陵文化展”将持续展出3个月
  • 科普|认识谵妄:它有哪些表现?患者怎样走出“迷雾”?