#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算法的更多相关文章

  1. 常用字符串匹配算法(brute force, kmp, sunday)

    1. 暴力解法 // 暴力求解 int Idx(string S, string T){ // 返回第一个匹配元素的位置,若没有匹配的子串,则返回-1 int S_size = S.length(); ...

  2. SRM 582 Div II Level Three: ColorTheCells, Brute Force 算法

    题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12581 Burte Force 算法,求解了所有了情况,注意  ...

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

    串结构练习——字符串匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述   给定两个字符串string1和string2,判断string2是否为strin ...

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

    写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法 ...

  5. 数据结构(十六)模式匹配算法--Brute Force算法和KMP算法

    一.模式匹配 串的查找定位操作(也称为串的模式匹配操作)指的是在当前串(主串)中寻找子串(模式串)的过程.若在主串中找到了一个和模式串相同的子串,则查找成功:若在主串中找不到与模式串相同的子串,则查找 ...

  6. 【实测】Python 和 C++ 下字符串查找的速度对比

    完整格式链接:https://blog.imakiseki.cf/2022/03/07/techdev/python-cpp-string-find-perf-test/ 背景 最近在备战一场算法竞赛 ...

  7. 数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找

    数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找 Boyer-Moore字符串查找算法 注意,<算法4>上将这个版本的实现称为Broyer-Moore算法,我看了 ...

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

    首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配. 这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表 ...

  9. Rabin-Karp字符串查找算法

    1.简介 暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理 ...

随机推荐

  1. matplotlib系列——饼图

    import matplotlib.pyplot as plt import numpy as np import matplotlib import sys 1.主体函数 #饼图 def die(l ...

  2. [Fw]初探linux中断系统(1)

    1. 重要接口 LDD上说,“内核维护了一个中断信号线的注册表,该注册表类似于I/O端口的注册表.模块在使用中断前要先请求一个中断通道(或者中断请求IRQ),然后在使用后释放该通道.” 撇开系统如何遍 ...

  3. Codefores 507B Amr and Pins

    B. Amr and Pins time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  4. asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密。

    原文:asp.net core 使用中间件拦截请求和返回数据,并对数据进行加密解密. GitHub demo https://github.com/zhanglilong23/Asp.NetCore. ...

  5. 五、hibernate表与表之间的关系(一对多关系)

    数据库表与表之间的关系 一对多:一个学校可以有多个学生,一个学生只能有一个学校 多对多:一个学生可以有多个老师,一个老师可以教多个学生 一对一:一个人只能有一个身份证号,一个身份证号只能找到一个人 一 ...

  6. HTML转成Excel设置单元格格式(文本)

    1) 文本:vnd.ms-excel.numberformat:@ 2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd 3) 数字:vnd.ms-excel.numb ...

  7. ArrayListMultimap

    遇到这样一个场景,就是要判断传过来的Lists里有几组相邻的元素,然后有多少个单一的元素,比如3,3,3,4,4,4,5,5,5,6,6,6,8,9,10,11 方法有很多,但是我选了ArrayLis ...

  8. day13 python生成器函数 推导式 生成器

    day13 python   一.生成器     生成器的本质就是迭代器     生成器的特点和迭代器一样. 取值方式和迭代器一样(__next__())     由生成器函数或生成器表达式来创建   ...

  9. 74th Jupyter Notebook 插入图片的方法

    转载: https://account.cnblogs.com/signin?ReturnUrl=http%3A%2F%2Fhome.cnblogs.com%2Fu%2Ferdou%2F   插入本地 ...

  10. ivew 修改排序号的逻辑

    排序号修改的逻辑 1.构建修改排序号传递的参数 formInline2:{ recommendType:4, //产品类型 merchantCodes:[], //产品code discountRec ...