やりたいことは、入力された文字列によってスキップ表を作り、それにより文字列がある位置を表示することです。
#include<stdio.h>
#include<string.h>
void compute_g(char [],int []);
void bm(char [],char []);
void compute_h(char[]);
int max(int a, int b);
int min(int a, int b);
int main(void)
{
char t[30];
char p[10];
strcpy(t,"ababdababccbdccabcadb");
printf("テキスト:%s\n",t);
printf("探したい文字列を入力してください:");
scanf("%s",p);
bm(t,p);
return 0;
}
void bm(char t[],char p[])
{
int m = strlen(p);
int n = strlen(t);
int i = m - 1;
int j = m - 1;
int flag= 0;
int g[256];
int h[m];
compute_g(p,g);
compute_h(p);
while(i >= 0 && j < n && j >= 0){
if(p[i] == t[j]){
i--;
j--;
}else{
j = j + max(g[(int)t[j]],h[i]);
i = m - 1;
}
if(i == -1){
printf("Pattern has found at %d.\n",j+1);
j=j+m+1;
i=m-1;
flag=1;
}
if(flag==0){
printf("Pattren has not found.\n");
}
}
}
void compute_g(char p[],int g[])
{
int c,k;
int m = strlen(p);
for(c = 0;c <= 255;c++){
g[c] = m-1;
}
for(k = 0;k <= m;k++){
g[(int)p[k]] = m - k - 2;
}
}
void compute_h(char p[])
{
int m=strlen(p);
int i,j;
int f[m];
int h[m];
for(i=0;i<m;i++){
h[i]=2*m-1-i;
}
i=m-1;
j=m;
f[m-1]=m;
while(i>=0){
if(j==m||p[i]==p[j]){
i--;
j--;
f[i]=j;
}else{
h[j]=min(h[j],m-1-i);
j=f[j];
}
}
for(i=0;i<m;i++)
{
h[i]=min(h[i],m-1+j-i);
if(i>j){
j=f[j];
}
}
}
int max(int a, int b)
{
if(a>b){
return a;
}else{
return b;
}
}
int min(int a, int b)
{
if(a<b){
return a;
}else{
return b;
}
}