c資料結構的字串尋找的Brute-Force演算法

來源:互聯網
上載者:User

標籤:des   style   os   資料   art   io   

#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演算法的時間效率不高,主要原因是:在主串和子串已有相當多個字元比較相等的情況下,只要有一個字元不相等,便需要把主串的比較位置回退。













相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.