c数据结构的字符串查找的Brute-Force算法

#include<stdio.h>

#include<malloc.h>

#include<string.h>

//定义字符串的结构体

typedef struct {

char *str;//字符串

int maxLength;//最大可以存放字符的长度

int length;//目前的字符长度

}DString;

//1.初始化操作

//初始化操作用来建立和存储串的动态数组空间以及给相关的数据域赋值

void Initiate(DString *s,int max,char *string){

int i;

s->str=(char *)malloc(sizeof(char)*max);//申请动态存储空间

s->maxLength=max;//动态数组元素的最大的个数

s->length=strlen(string);//置串的当前长度

for(i=0;i<s->length;i++){//进行for循环赋值

s->str[i]=string[i];//赋值

}

}

//2.插入子串操作

int Insert(DString *s,int pos,DString t){

//在主串s的pos位置插入子串t,插入成功返回1,失败返回0

int i;

if(pos<0){

printf("参数pos的位置出错,pos<0\n");

return 0;

}else{

//如果空间不够,则进行从新分配空间

if(s->length+t.length>s->maxLength){

//重新申请s->str所指的数组空间,原数组元素存放在新数组的前面

realloc(s->str,(s->length+t.length)*sizeof(char));

s->maxLength=s->length+t.length;//最大的长度变了

}

for(i=s->length-1;i>=pos;i--){

//依次往后移动t.length个位置

s->str[i+t.length]=s->str[i];

}

//在pos位置进行插入操作

for(i=0;i<t.length;i++){

s->str[pos+i]=t.str[i];//插入

}

s->length=s->length+t.length;//置新的数据元素的位置

return 1;

}

}

//3.删除子串操作

int Delete(DString *s,int pos,int len){

//删除主串s从pos位置开始的长度为len的子串,删除成功则返回1,失败则返回0

int i;

if(s->length<=0){

printf("数组中未存放字符无元素可删!\n");

return 0;

}else if(pos<0||len<0||pos+len>s->length){

printf("参数pos和len不合法!\n");

return 0;

}else{

for(i=pos+len;i<=s->length-1;i++){

s->str[i-len]=s->str[i];//依次前移len歌位置

}

s->length=s->length-len;//置新的元素的个数

return 1;

}

}

//4.取子串操作

int SubString(DString *s,int pos,int len,DString *t){

//取主串从pos位置开始的长度为len的子串,取成功则返回1,失败则返回0

int i;

if(pos<0||len<0||pos+len>s->length){

printf("参数pos和len的位置出错!!!\n");

return 0;

}

//当t的空间不够的时候,在进行从新分配空间

if(len>t->maxLength){

t->str=(char *)realloc(t->str,len*sizeof(char));//重新申请数组空间

t->maxLength=len;

}

for(i=0;i<len;i++){

t->str[i]=s->str[pos+i];//取子串

}

t->length=len;

return 1;

}

//5.撤销操作

void Destroy(DString *s){

//撤销串s占用的内存空间

free(s->str);

s->maxLength=0;

s->length=0;

}

//Brute-Force算法函数的设计

//i变量指示主串s当前比较字符的下标

//用j变量表示子串t当前比较字符的下标

int BFIndex(DString s,int start,DString t){

int i=start,j=0,v;

while(i<s.length&&j<t.length){

if(s.str[i]==t.str[j]){

i++;

j++;

}else{

i=i-j+1;

j=0;

}

}

if(j==t.length){

v=i-t.length;

}else{

v=-1;

}

return v;

}

int main(){

/*

DString myString1,myString2,myString3;

int i,max1=5,max2=9,max3=0;

//测试初始化函数

Initiate(&myString1,max1,"Data");

Initiate(&myString2,max2," Structure");

Initiate(&myString3,max3,"");

printf("初始化myString2串:        ");

for(i=0;i<myString2.length;i++)

printf("%c",myString2.str[i]);

printf("    maxLength=%d",myString2.maxLength);

printf("    length=%d\n",myString2.length);

//测试插入函数

Insert(&myString2,0,myString1);

printf("插入子串后myString2串:  ");

for(i=0;i<myString2.length;i++)

printf("%c",myString2.str[i]);

printf("    maxLength=%d",myString2.maxLength);

printf("    length=%d\n",myString2.length);

//测试删除函数

Delete(&myString2,0,5);

printf("删除子串后myString2串:  ");

for(i=0;i<myString2.length;i++)

printf("%c",myString2.str[i]);

printf("    maxLength=%d",myString2.maxLength);

printf("    length=%d\n",myString2.length);

//测试取子串函数

SubString(&myString2,0,5,&myString3);

printf("取子串后myString3串:  ");

for(i=0;i<myString3.length;i++)

printf("%c",myString3.str[i]);

printf("    maxLength=%d",myString3.maxLength);

printf("    length=%d\n",myString3.length);

////////////////////////////

for(i=0;i<myString2.length;i++)

printf("%c",myString2.str[i]);

printf("    maxLength=%d",myString2.maxLength);

printf("    length=%d\n",myString2.length);

//测试撤销函数

//Destroy(&myString1);

//Destroy(&myString2);

//Destroy(&myString3);

*/

DString myString1,myString2;

int max1=29,max2=9;

int pos=0;

Initiate(&myString1,max1,"Data Structure Data Structure");

Initiate(&myString2,max2,"Structure");

//第一次查找

pos=BFIndex(myString1,pos,myString2);

printf("第一次查找时 pos=%d\n",pos);

//第二次查找

pos=BFIndex(myString1,pos+1,myString2);

printf("第二次查找时 pos=%d\n",pos);

return 0;

}

brute-force算法简单易于理解,在大部分的情况下,该算法的效率较好,但是在有些情况下,brute-force算法的时间效率不高,主要原因是:在主串和子串已有相当多个字符比较相等的情况下,只要有一个字符不相等,便需要把主串的比较位置回退。

c数据结构的字符串查找的Brute-Force算法,布布扣,bubuko.com

时间: 2025-01-05 13:20:47

c数据结构的字符串查找的Brute-Force算法的相关文章

python数据结构之字符串查找两例

查找字符串中最长连续数字子串 问题描述 查找给定字符串中最长的数字字串,返回其起始下标,长度和字串.例如: input  :abc12345cd123ef234567df output:15 6 234567 实现 ''' 查找给定字符串中最长的数字字串,返回其起始下标,长度和字串.例如: input :abc12345cd123ef234567df output:15 6 234567 ''' def find_max_length_str(string): str_length = len(

数据结构之 字符串---字符串匹配(kmp算法)

串结构练习——字符串匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定两个字符串string1和string2,判断string2是否为string1的子串. 输入 输入包含多组数据,每组测试数据包含两行,第一行代表string1,第二行代表string2,string1和string2中保证不出现空格. 输出 对于每组输入数据,若string2是string1的子串,则输出"YES",否则输出"NO". 示例输入

子字符串查找之————关于KMP算法你不知道的事

写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法.即通过next数组来作为有限状态自动机,以此实现非匹配时的回退.这不失为一种好的方法. 但我们接下来要见识的是一种更好和更完整的方法————拥有完整DFA的KMP算法 先列出本文要介绍的方法与一般方法对比下的几大优点: 在最坏情况下,对字符串的操作次数仅为一般做法的三分之二. 在所有情况下,对字符

字符串处理------Brute Force与KMP

一,字符串的简单介绍 例:POJ1488  http://poj.org/problem?id=1488 题意:替换文本中的双引号: #include <iostream> #include <cstring> #include <cstdio> using namespace std; int main() { char c,flag=1; //freopen("Atext.in","r",stdin); while((c=ge

Rabin-Karp指纹字符串查找算法

首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配. 这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表预留任何空间, 因为它只有一个元素. 基本思想 长度为M的字符串对应着一个R进制的M位数, 为了用一张大小为Q的散列表来保存这种类型的键, 需要一个能够将R进制的M位数转化为一个0到Q-1之间的int值散列函数, 这里可以用除留取余法. 举个例子, 需要在文本 3 1 4 1 5 9 2 6 5 3

Rabin-Karp字符串查找算法

1.简介 暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理.然而它最大的问题就是运行速度太慢,所以在很多场合下暴力字符串匹配算法并不是那么有用.我们需要一些更快的方法来完成模式匹配的工作,然而在此之前,我们还是回过头来再看一遍暴力法匹配,以便更好地理解其他子串匹配算法. 如下图所示,在暴力字符串匹配里,我们将文本中的每一个字符和模式串的第一个字符进行比对.

SDUT 3375 数据结构实验之查找三:树的种类统计

数据结构实验之查找三:树的种类统计 Time Limit: 400MS Memory Limit: 65536KB Submit Statistic Problem Description 随着卫星成像技术的应用,自然资源研究机构可以识别每一个棵树的种类.请编写程序帮助研究人员统计每种树的数量,计算每种树占总数的百分比. Input 输入一组测试数据.数据的第1行给出一个正整数N (n <= 100000),N表示树的数量:随后N行,每行给出卫星观测到的一棵树的种类名称,树的名称是一个不超过20

一步一步写算法(之字符串查找 下篇)

原文:一步一步写算法(之字符串查找 下篇) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 前面我们谈到了KMP算法,但是讲的还不是很详细.今天我们可以把这个问题讲的稍微详细一点.假设在字符串A中寻找字符串B,其中字符串B的长度为n,字符串A的长度远大于n,在此我们先忽略. 假设现在开始在字符串A中查找,并且假设双方在第p个字符的时候发现查找出错了,也就是下面的情况: /* * A: A1 A2 A3 A4 ... Ap ........

基本算法——字符串查找之KMP算法

虽然,c++标准库中为我们提供了字符串查找函数,但我们仍需了解一种较为快捷的字符串匹配查找——KMP算法. 在时间复杂度上,KMP算法是一种较为快捷的字符串匹配方法. 实现代码如下: 1 #include <iostream> 2 #include <string> 3 #include <vector> 4 #include <stdexcept> 5 using namespace std; 6 7 void get(const string &