#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算法的时间效率不高,主要原因是:在主串和子串已有相当多个字符比較相等的情况下。仅仅要有一个字符不相等。便须要把主串的比較位置回退。

最新文章

  1. ref 和 out
  2. 转 java中的session
  3. lsof 简介
  4. YSPASYS 中小型企业简单员工评价考核系统
  5. block(四)揭开神秘面纱(下)
  6. sqlserver、mysql、oracle各自的默认端口号
  7. java json字符串转List、Map等对象
  8. CSS3秘笈复习:十三章&amp;十四章&amp;十五章&amp;十六章&amp;十七章
  9. Git详解之九:Git内部原理
  10. ArcGIS License启动无响应
  11. HP DL380服务器RAID信息丢失数据恢复方法和数据恢复过程分享
  12. Web技术的发展 网络发展简介(三)
  13. 剑指Offer_编程题_6
  14. 内训--2小时 Word精髓
  15. 【转】Thread Local的正确原理与适用场景
  16. Mysql 批量更新update的表与表之间操作
  17. 问题记录,如何解决confluence的office预览的时候的乱码问题
  18. kali删除软件
  19. ubuntu docker 安装
  20. 9.1_the end

热门文章

  1. Fiddler设置展示接口响应时间
  2. 63.Perfect Squares(完美平方数)
  3. c# 遍历 Mysql 所有表所有列,查找目标数据
  4. Educational Codeforces Round 33 D. Credit Card
  5. Linux上部署Springboot相关命令
  6. Django版本更新(升级)到指定版本的命令
  7. linux 定时任务---给心爱的小姐姐发情书
  8. linux随笔-03
  9. java while循环
  10. H3C F100-S-G2接口配置