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)进行预处理 ...
随机推荐
- ubantu下关于linux命令合集
ubantu下linux的命令与操作 1.熟悉linux目录是学习linux非常必要的第一步 linux目录结构: linux目录: /:根目录,一般根目录下只存放目录,在Linux下有且只有一个根目 ...
- BUUCTF Youngter-drive
exe逆向,首先查壳,发现有upx壳,upx -d脱壳,拖进ida找到主函数这里可以看到创建了两个线程,先沿着StartAddress,一直找到sub_411940,这里有一个问题,当使用f5是,会显 ...
- 安卓SDK的配置流程以及安装build-tools等插件
这两天做了一个移动端混合开发的项目,需要配置安卓的SDK,不过在这之前,需要先配置好Java环境(这个在这里就不写了).下面开始配置步骤: 1.下载SDK,然后解压到某个目录下面.推荐两个下载网址: ...
- HTML转成Excel设置单元格格式(文本)
1) 文本:vnd.ms-excel.numberformat:@ 2) 日期:vnd.ms-excel.numberformat:yyyy/mm/dd 3) 数字:vnd.ms-excel.numb ...
- tensorflow 版本的mask rcnn 实践
1. https://www.jianshu.com/p/27e4dc070761 (tensorflow object detection API/Mask RCNN)
- How can I check the last time stats was run on Oracle without using OEM
All of the following data dictionary tables have a LAST_ANALYZED column (replace * with USER/ALL/DBA ...
- vector<类指针>清理
https://www.cnblogs.com/nanke/archive/2011/05/10/2042662.html 1.vector<class> &aa,作为函数参数 2 ...
- 线程监控ProcessMonitor
软件行为 在线监测 注册表 行为判断
- MySQL系统架构
已经很久没有写博客了,平时总感觉没有时间写,但是却有大把的时间去走神,去做一些无用的事情.写博客是挺锻炼人的一个过程,不仅锻炼写作能力,坚持写还能够大幅提升技术水平,写出来还能够有广大的网友帮助我们纠 ...
- python 环境准备-centos7
python3环境搭建[本身centosyum底层也是py2.x实现的,装3.x的时候要实现多版本共存这里解决了这些问题] 安装编译环境# yum -y groupinstall 'Developme ...