您的位置:首页 > 其它

字符串匹配之BM算法

2015-06-23 13:32 197 查看
最近,涉及到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];

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: