串操作算法虚拟实现

//串:它是有限字符集中的零个或多个字符组成的有限序列
//一种特殊的线性表

int indexz(String S,String T,int pos)
{
	//T为非空串,若主串S中第pos个字符之后存在与T相等
	//的子串,则返回第一个这样的子串在S中的位置
	if(pos>0)
	{
		n=StrLength(S);//求出主字符串的长度
		m=StrLength(T);//求出非空串的长度
		i=pos;
		while(i<=n-m+1)
		{
			SubString(sub,S,i,m);
			if(StrCompare(sub,T)!=0)//依次让非空串和主串比较是否相等
				i++;//如果不等,让非空串在主串上移动一位
			else
				return i;//如果找到相同的,就返回主串中的位置
		}
	}
	return 0;
}

//1.定义串的定长

#define MAXSTRLEN 255//用户可在255内定义最大串长
Typedef unsigned char Sstring[MAXSTRLEN+1];//0号单元存放串的长度

//2.串链接:用T返回由S1和S2链接而成的新串,若未截断,返回TRUE

Status Concat(SString &T,SString S1,SString S2)
{
	if(S1[0]+S2[0]<=MAXSTRLEN)//如果两个串长度之和小于新串T的长度
	{
		T[1...S1[0]=S1[1..S1[0]];//S1[0]表示最后一个元素,把S1中所有元素赋到T中
		T[S1[0]+1..S1[0]+S2[0]]=S2[1...S2[0]];//把S2中元素赋到S1元素+1后面,正好链接
		T[0]=S1[0]+S2[0];//最后T串长度就是两个串长度之和
		uncut=TRUE;//没有被截断
	}

	else if(S1[0]<MAXSTRSIZE)
		//第二种情况,S1长度小于T,但S1+S2大于T,这样,S1完全插入,而S2没有完全
	{
		T[1..S1[0]=S1[1...S1[0]];//把S1中的元素都赋到T中
		T[S1[0]+1...MAXSTRLEN]=S2[1..MAXSTRLEN-S1[0]];//把S2中部分元素链接到S1后面
		T[0]=MAXSTRLEN;//T的长度等于开始T的分配 长度
		uncut=FALSE;//串被截断
	}

	else
		//第三种情况,串T等于串S1的长度。
	{
		T[0...MAXSTRLEN]=S1[0...MAXSTRLEN];//把S1所有元素赋到T中
		uncut=FALSE;//被截断
	}
	return uncut;
}

//3.求子串的函数
//用Sub返回串S的第POS个字符起长度为Len的子串
//1<=pos<=StrLength(s)且0<=len<=StrLength(S)-pos+1

Status SubString(Sstring &Sub,SString S,int pos,int len)
{
	if(pos<1||pos>S[0]||len<0||len>S[0]-pos+1)//如果pos不合法或者长度溢出,
		return ERROR;//返回错误
	Sub[1..len]=S[pos..pos+len-1];//把符合情况的子串赋给新串
	Sub[0]=len;//Sub[0]用来存放数组的长度
	return OK;
}

//4。子串匹配算法。:返回子串T在主串S中第POS个字符之后的位置,
//若不存在,返回0
{
	i=pos;//i为主串的移动指针
	j=1;//J为在子串上移动的指针
	while(i<=S[0]&&j<=T[0])//如果两个指针都小于各自的最大长度
	{
		if(S[i]==T[j])//如果比较时候相等
		{
			i++;//让主串指针移动到下一个位置
			j++;//子串指针也移动到下一位置
		}
		else
		{
			i=i-j+2;//回溯,就是让主串指针回到最后比较的下一位,最为比较起点
			j=1;//让子串让从头开始与主串比较
		}
	}
	if(j>T[0])//当子串指针移动到最后仍然相等,那就返回其位置,说明找到
		return i-T[0];
	else
		return 0;
}

//5.串置换:将串"S"中所有子串"T"的出现都换成"v"
//在S中定位t,然后根据t和v二者的长度;
t.curlen<v.curlen:后移动v.curlen-t.curlen
t.curlen=v.curlen:替换
t.curlen>v.curlen:前移动t.curlen-v.curlen
//重复,直到s中不存在t为止

时间: 2024-10-13 19:08:00

串操作算法虚拟实现的相关文章

串操作,C++实现

对串的基本操作都全已经实现 对kmp,kf字符串替换等功能全都已经实现 由于时间原因.没来得及注释,希望大家参考见谅. 串操作hstring.h头文件实现 //kallen 1 #ifndef _HSTRING_H_ 2 #define _HSTRING_H_ 3 #include <iostream> 4 class mString 5 { 6 public: 7 mString(); 8 void newString(const char *ms); 9 ~mString(); 10 bo

YJX_Driver_038_内核模式下的字串操作

1. 内核模式下的字串操作 A.ASCII字符串和UNICODE字符串 B.ANSI_STRING字符串和UNICODE_STRING字符串 C.字符串的初始化与销毁 D.字符串复制,比较,(大小写,整数和字串)相互转换 E.ANSI_STRING字符串和UNICODE_STRING字符串相互转换 2. A.ASNI字符串和UNICODE字符串 在C语言中,有ANSI和UNICODE 两个不同字串类型. char* s1="abc"; //CHAR * s1="abc&quo

STL之heap相关操作算法

说明:本文仅供学习交流,转载请标明出处,欢迎转载! 堆(heap)是一种非常重要的数据结构(这里我们讨论的是二叉堆),它是一棵满足特定条件的完全二叉树,堆的定义如下: 堆是一棵树完全二叉树,对于该完全二叉树中的每一个结点x,其关键字大于等于(或小于等于)其左右孩子结点,而其左右子树均为一个二叉堆. 在上述的定义中,若堆中父亲结点关键字的值大于等于孩子结点,则称该堆为大顶堆:若堆中父亲结点关键子的值小于等于孩子结点,则称该堆为小顶堆. 由于堆是一棵完全二叉树,所以我们可以很轻易地用一个数组存储堆中

汇编-串操作-字符串拷贝

 一.实习题目:串操作 二.实习目的:掌握串操作程序设计的基本方针 三.实习内容:将首地址DATA1按字节存储的数据块通过使用字符串操作将其移动到首地址为 DATA2的数据块中. 四.代码: <strong> </strong>data segment dataOne db 'It is a temp string',0ah,0dh,'$' dataTwo db 50 dup(?) msgOne db 0ah,0dh,'source string:','$' msgTwo db

Hdu 3068 最长回文字串Manacher算法

题目链接 最长回文 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7976    Accepted Submission(s): 2735 Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等 Input 输入

汇编实现: C库常见函数,串操作指令作用

目录 汇编实现: C库常见函数 一丶汇编实现Strncpy拷贝函数 汇编实现: C库常见函数 一丶汇编实现Strncpy拷贝函数 void __asmStrncpy(char *des,char *src,int len) { __asm { mov edi,[ebp + 8]; //获取局部变量地址 des mov esi,[ebp + 0xc]; //获取局部变量地址 src mov ecx,len; //使用movs指令,需要给ecx长度 cld //设置DF = 0; 内存方向, 此时e

定长串操作

串操作在数据结构中也是十分重要的一部分,首先需要理解串,串长,串相等,空格串,空串,子串的概念.我们在编程过程中,对于字符串的操作,就是一种串结构的使用. 串:是指通常说所的字符串,如:"abcde","PI"等 串长:是指字符串的长度,如:"abcde"长度为5,"PI"长度为2 串相等:两个字符串的长度和内容均相等,如:"abcde"和"abcde" 空格串:字符串由一个或多个空格组

Manacher 入门+模板 回文串专用算法

Manacher 算法 回文串专用算法 manacher 人名,该算法的发明者.palindrome名词:回文. 博客推荐 https://www.cnblogs.com/lykkk/p/10460087.html,比较简洁,代码清晰. https://www.cnblogs.com/cloudplankroader/p/10988844.html, 一些细节的东西比较讲解比较细. 模板 //预处理函数,使得处理后的字符串长度为奇数,并且有一些比较好的性质 int init(char* s, c

数据结构-串操作应用之词索引表

为书库创建查询索引表 建立词索引表基本步骤: 1.从书目文件中读入一个书目单. 2.从书目单中提取所有关键字插入词表. 3.对词表中的每一个关键字在索引表中进行查找并作相应的插入操作. 详细操作: 1.为识别从书名串中分离出来的单词是否是关键字,需要一张常用词表.顺序扫描书目单,首先分离单词,然后查找常用词表,若不和表中任一词相等,则为关键字,插入临时存放关键字的词表中. 2.在索引表中查询关键字时可能出现两种情况:其中一种是索引表上已经有此关键词的索引项,只要在该项中插入书号索引即可:其二是需