study2015. 1. 29. 11:05

문자열 검색 알고리즘 간단히 설명하면 문자열을 검색할 때 앞에서 부터 하는게 아니라 뒤에서 부터 시작하는 알고리즘이다.

비교를 하다가 문자가 다르다는 것을 알았다면, 그 문자가 검색키 문자열에 포함되어 있다면 그 만큼 이동함.

그 문자가 포함되어 있지 않다면 검색키 문자열 길이만큼 점프.

자세한건 아래 참고.

http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm

간단하게 C언어로 구현해 보았다.

#include <stdio.h>


#define MAXLEN 1000


int mystrlen(char *m)

{

int n = 0;

while (*m != '\0') {

*m++;

n++;

}

return n;

}


bool compareString(char s[], char k[], int idx, int keyLen, int* jumpIdx)

{

int last = keyLen-1;

bool matchFlag = true;


for (int i = (idx + last); i >= 0; i--)

{

//printf("s[%d]=(%c), key[%d]=(%c)\n", i, s[i], last, k[last]);


if (s[i] == k[last])

{

if (last == 0)

{

*jumpIdx = keyLen;

return true;

}

}

else {

for (int j = last-1; j >=0; j--)

{

if (k[j] == s[i])

{

*jumpIdx = keyLen-j-1;

return false;

}

}


*jumpIdx = keyLen;

return false;

}


last--;

}

return false;

}


void main()

{

char source[MAXLEN] = "tomato dog cat radio good";

char key[10] = "cat";

int keyLen = mystrlen(key);

for (int i = 0; source[i] != '\0';)

{

int jump = 0;


//printf("\n==>\n");

//for (int j = 0; j < keyLen && source[i + j] != '\0'; j++)

//{

// printf("%c", source[i + j]);

//}


//printf("\n");

//for (int j = 0; j < keyLen ; j++)

//{

// printf("%c", key[j]);

//}


//printf("\n==<\n");


bool a = compareString(source, key, i, keyLen, &jump);

if (a)

printf("match");


i += jump;

}

printf("n=%d", mystrlen(key));


printf("\n");

}





Posted by 평면우주