字符串匹配之BM算法

最近,涉及到android下的c++开发,但是麻烦在于,在android平台下编译的话,如果使用了标准库中的iostream, fstream等,会使得编译出来的二进制代码体积过度膨胀,


所以需要去除iostream等标准库的使用,当然, STL中的<string>模板也会使得代码体积增大, 是由于string间接包含了其他标准库文件;


同时,std::string采用模板技术,所以效率也不高,也会导致代码膨胀,处于各方面需要考虑,实现了一个简单的KyString类,作为内部使用:


当然,还有许多不足,请高人指教:



字符串KyString类实现的主要难度在于find以及rfind,如下为其核心字符串匹配算法,请参考代码实现:



BM算法正向查找字符串代码如下:


inline int index_BM(const char *S, const char *T, int pos = 0)  
{  
int i;  
int j;  


i = pos;  
j = 0;   


while ( (i < strlen(S)) && (j < strlen(T)) )  
{  
if (S[i] == T[j])  
{  
i++;  
j++;  
}  
else  
{  
i = i - j + 1;   
j = 0;  
}  
}  


if (strlen(T) == j)  
{  
return i - strlen(T);  
}  
else  
{  
return -1;  
}  
}


BM算法反向查找字符串代码如下:


inline int index_BMR(const char *S, const char *T, int pos = 0)  
{  
int i;  
int j;  


i = strlen(S);  
j = strlen(T);   


int len = strlen(T);


while ( (i > 0) && (j > 0) )  
{  


if (S[i - 1] == T[j - 1])  
{  
i--;  
j--;  
}  
else  
{  
i = i + (len - j) - 1;   
j = len;  
}  
}  


if (j == 0)  
{  
return i;  
}  
else  
{  
return -1;  
}  
}  



// KyStirng.h

#ifndef KYSTRING_H_
#define KYSTRING_H_


class KyString
{
friend KyString operator+(const KyString &lhs, const KyString &rhs);
public:
KyString();
KyString(const KyString &str);
KyString(const char *str);
~KyString();
KyString& operator=(const KyString &str);
public:
// 判断是否为空
bool empty() const;
// 获取字符串的大小
int size() const;
// 获取字符串的长度
int length() const;
//


const char* c_str();
//
void append(const char *str);
//
bool operator==(const KyString &str);
//
KyString& operator+=(const KyString &str);
//
int rfind(const char *sub) const;
//
int find(const char *sub) const;
//
KyString sub_str(int start, int end);
//
char& operator[](int idex);
//
const char& operator[](int idx) const;
private:
char *buffer;
};




#endif /* KYSTRING_H_ */




// KyString.cpp


#include <stdio.h>
#include <string.h>
#include "KyString.h"






KyString::KyString()
{
buffer = NULL;
}


KyString::KyString(const KyString &str)
{
if(str.buffer == NULL)
{
buffer = NULL;
}
else
{
buffer = new char[strlen(str.buffer) + 1];
strcpy(buffer, str.buffer);
}
}


KyString::KyString(const char *str)
{
if(str == NULL)
{
buffer = NULL;
}
else
{
buffer = new char[strlen(str) + 1];
strcpy(buffer, str);
}
}


KyString& KyString::operator=(const KyString &str)
{
if(this == &str)
{
return *this;
}
else
{
if(str.buffer == NULL)
{
buffer = NULL;
return *this;
}
else
{
if(buffer != NULL)
{
delete []buffer;
buffer = NULL;
}
buffer = new char[strlen(str.buffer) + 1];
strcpy(buffer, str.buffer);
}
}
}


KyString::~KyString()
{
if(buffer != NULL)
{
delete []buffer;
buffer = NULL;
}
}
// 判断是否为空
bool KyString::empty() const
{
if(buffer != NULL && strlen(buffer) > 0)
{
return true;
}
else
{
return false;
}


}


// 获取字符串的大小
int KyString::size() const
{
int size = strlen(buffer) + 1;
return size;
}


// 获取字符串的长度
int KyString::length() const
{
int len = strlen(buffer);
return len;
}


//
const char* KyString::c_str()
{
return buffer;
}


//
void KyString::append(const char *str)
{
if(str != NULL)
{
if(buffer != NULL)
{
int len_left = strlen(buffer);
int len_right = strlen(str);
char *tmp_buffer = new char[len_left + len_right + 1];
strcpy(tmp_buffer, buffer);
strcat(tmp_buffer, str);
delete []buffer;
buffer = NULL;
buffer = tmp_buffer;
}
else
{
int len = strlen(str);
buffer = new char[len + 1];
strcpy(buffer, str);
}
}
}


//
bool KyString::operator==(const KyString &str)
{
if(buffer == NULL || str.buffer == NULL)
{
return false;
}
else
{
if(!strcmp(buffer, str.buffer))
{
return true;
}
else
{
return false;
}
}




}




//
KyString& KyString::operator+=(const KyString &str)
{
if(this == &str)
{
return *this;
}


KyString tm;
tm.buffer = NULL;


if(str.buffer == NULL)
{
return *this;
}


if(buffer != NULL)
{
int len_left = strlen(buffer);
int len_right = strlen(str.buffer);
char *tmp_buffer = new char[len_left + len_right + 1];
strcpy(tmp_buffer, buffer);
strcat(tmp_buffer, str.buffer);
delete []buffer;
buffer = NULL;
buffer = tmp_buffer;
}
else
{
int len = strlen(str.buffer);
buffer = new char[len + 1];
strcpy(buffer, str.buffer);
}


}


KyString operator+(const KyString &lhs, const KyString &rhs)
{
KyString tmp;


tmp.append(lhs.buffer);
tmp.append(rhs.buffer);
return tmp;
}


inline int index_BMR(const char *S, const char *T, int pos = 0)  
{  
int i;  
int j;  


i = strlen(S);  
j = strlen(T);   


int len = strlen(T);


while ( (i > 0) && (j > 0) )  
{  


if (S[i - 1] == T[j - 1])  
{  
i--;  
j--;  
}  
else  
{  
i = i + (len - j) - 1;   
j = len;  
}  
}  


if (j == 0)  
{  
return i;  
}  
else  
{  
return -1;  
}  
}  


inline int index_BM(const char *S, const char *T, int pos = 0)  
{  
int i;  
int j;  


i = pos;  
j = 0;   


while ( (i < strlen(S)) && (j < strlen(T)) )  
{  
if (S[i] == T[j])  
{  
i++;  
j++;  
}  
else  
{  
i = i - j + 1;   
j = 0;  
}  
}  


if (strlen(T) == j)  
{  
return i - strlen(T);  
}  
else  
{  
return -1;  
}  
}
//
int KyString::rfind(const char *sub) const
{
if(sub == NULL)
{
return -1;
}
else
{
if(buffer == NULL)
{
return -1;
}
else
{
return index_BMR(buffer, sub);
}
}
}
//
int KyString::find(const char *sub) const
{
if(sub == NULL)
{
return -1;
}
else
{
if(buffer == NULL)
{
return -1;
}
else
{
return index_BM(buffer, sub);
}
}
}
//
KyString KyString::sub_str(int start, int end)
{
if(buffer == NULL)
{
return KyString("");
}


if(start < 0 || end <= 0 || end <= start)
{
return KyString("");
}
int len = end - start;
char *new_buffer = new char[len + 1];
memset(new_buffer, 0, len + 1);
memcpy(new_buffer, buffer + start, len);
KyString tmp(new_buffer);
delete []new_buffer;
new_buffer = NULL;
return new_buffer;
}


//
char& KyString::operator[](int idx)
{
if(buffer != NULL && idx >= 0 && idx < strlen(buffer))
{
return buffer[idx];
}
}
//
const char& KyString::operator[](int idx) const
{
if(buffer != NULL && idx >= 0 && idx < strlen(buffer))
{
return buffer[idx];
}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

seasermy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值