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算法的更多相关文章
- 常用字符串匹配算法(brute force, kmp, sunday)
1. 暴力解法 // 暴力求解 int Idx(string S, string T){ // 返回第一个匹配元素的位置,若没有匹配的子串,则返回-1 int S_size = S.length(); ...
- SRM 582 Div II Level Three: ColorTheCells, Brute Force 算法
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=12581 Burte Force 算法,求解了所有了情况,注意 ...
- 数据结构之 字符串---字符串匹配(kmp算法)
串结构练习——字符串匹配 Time Limit: 1000MS Memory limit: 65536K 题目描述 给定两个字符串string1和string2,判断string2是否为strin ...
- 子字符串查找之————关于KMP算法你不知道的事
写在前面: (阅读本文前需要了解KMP算法的基本思路.另外,本着大道至简的思想,本文的所有例子都会做从头到尾的讲解) 作者翻阅了大量网上现有的KMP算法博客,发现广为流传的竟然是一种不完整的KMP算法 ...
- 数据结构(十六)模式匹配算法--Brute Force算法和KMP算法
一.模式匹配 串的查找定位操作(也称为串的模式匹配操作)指的是在当前串(主串)中寻找子串(模式串)的过程.若在主串中找到了一个和模式串相同的子串,则查找成功:若在主串中找不到与模式串相同的子串,则查找 ...
- 【实测】Python 和 C++ 下字符串查找的速度对比
完整格式链接:https://blog.imakiseki.cf/2022/03/07/techdev/python-cpp-string-find-perf-test/ 背景 最近在备战一场算法竞赛 ...
- 数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找
数据结构与算法--Boyer-Moore和Rabin-Karp子字符串查找 Boyer-Moore字符串查找算法 注意,<算法4>上将这个版本的实现称为Broyer-Moore算法,我看了 ...
- Rabin-Karp指纹字符串查找算法
首先计算模式字符串的散列函数, 如果找到一个和模式字符串散列值相同的子字符串, 那么继续验证两者是否匹配. 这个过程等价于将模式保存在一个散列表中, 然后在文本中的所有子字符串查找. 但不需要为散列表 ...
- Rabin-Karp字符串查找算法
1.简介 暴力字符串匹配(brute force string matching)是子串匹配算法中最基本的一种,它确实有自己的优点,比如它并不需要对文本(text)或模式串(pattern)进行预处理 ...
随机推荐
- htmlspecialchars_decode 解决掉 &
如果在请求中返回的内容包含 & 请使用htmlspecialchars_decode 搞一下,去掉. 这个纯粹为自己怕到时又找不到这个方法
- C++中采用操作符重载完善复数类
1,复数类应该具有的操作: 1,运算:+,-,*,/: 2,比较:==,!=: 3,赋值:=: 4,求模:modulus: (5),完善的复数类操作符重载必不可少: 2,利用操作符重载: 1,统一复数 ...
- [FW]使用kprobes查看内核内部信息
使用printk打印变量等方法,是调试内核的有效方法之一,但是这种方法必须重新构建并用新内核启动,调试效率比较低.以内核模块的方式使用kprobes.jprobes,就可以在任意地址插入侦测器,执行包 ...
- RabbitMq--2--安装
简单说下个人的理解,mq就是一个消息代理,负责异步消息转发,可以很大程度缓解服务器压力,并且防止服务器宕机影响业务等. 安装: 环境:centos7 1).首先需要安装erlang #wget htt ...
- 35.Unique Paths(不同的路径)
Level: Medium 题目描述: A robot is located at the top-left corner of a m x n grid (marked 'Start' in ...
- 常用Message Queue对比
目前业界有很多MQ产品,我们作如下对比: RabbitMQ 是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP, STOMP,也正是如此,使的它变的非常重量 ...
- XMPP即时通讯协议使用(十)——好友关系状态
sub ask recv 订阅 询问 接受 含义 substatus -1- 应该删除这个好友 Indicates that the roster item should be ...
- eclipse导入了jar查看不了源码解决方法
当导入源码的时候ctrl+左键的时候,还是查看不了源码.问题一直困扰我很久,百度了很多方法.现在分享下解决的方法. 经过简单整理,如下: 第一步:下载JAD . jad官方地址的官方下载地址是: ht ...
- 2019HDU多校第一场 String 贪心
题意:给你一个字符串,问是否存在一个长度为m的子序列,子序列中对应字符的数目必须在一个范围内,问是否存在这样的字符串?如果存在,输出字典序最小的那个. 思路:贪心,先构造一个序列自动机,序列自动机指向 ...
- mongodb重置密码
1.删除服务,重新创建没有验证的服务 2.关闭服务后修改conf文件auth=false或者 3.重新开启服务后然后进入mongo 查看是否存在用户 use admin db.system.users ...