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)进行预处理 ...
随机推荐
- Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/ssm]]
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].Standard ...
- 调用Consul服务(消费服务)
调用Consul服务(消费服务) 依赖项 在spring-cloud-consul-client项目中添加依赖项,POM文件内容中添加如下依赖项: <dependency> <gro ...
- laravel在路由中设置中间件
//单个 路由 Route::get( 'admin/admin/index' , [ 'middleware' => 'old', 'uses' => 'Admin\AdminContr ...
- 二、python基础之列表、元组
一.列表 列表的概念: 列表由一系列按特定顺序排列的元素组成.你可以创建包含字母表中所有字母.数字0-9或所有家庭成员姓名的列表:也可以将任何东西加入列表中,其中的元素之间没有任何关系.鉴于列表通常包 ...
- PHP 与Python 读取大文件的区别
php读取大文件的方法 <?php function readFile($file) { # 打开文件 $handle = fopen($file, 'rb'); while (feof($ ...
- 四、附加到进程调试(.NET Framework)
附加到进程调试: 1.需要在IIS配置环境并可运行即通过浏览器可打开. 2.找到项目w3wp.exe进程并附加到进程调试,点击项目添加断点,直接访问浏览器即可. 优点:w3wp.exe是已经运行的,调 ...
- 前端学习(二十七)存储&es6(笔记)
cookie 存储 以站点为单位的. 必须配合服务器环境 不能跨浏览器 cookie有生命周期 默认是session session ...
- 代码解释n |= n >>> 16
public static int nextPowerOf2(int n) {n -= 1;n |= n >>> 16;n |= n >>> 8;n |= n &g ...
- python的logging,将log保存到文件
import logging logging.basicConfig(level=logging.DEBUG, format='%(asctime)s %(filename)s[line:%(line ...
- 【多线程】ConcurrentLinkedQueue 的实现原理
1. 引言 在并发编程中我们有时候需要使用线程安全的队列.如果我们要实现一个线程安全的队列有两种实现方式:一种是使用阻塞算法,另一种是使用非阻塞算法.使用阻塞算法的队列可以用一个锁(入队和出队用同一把 ...