#include<stdlib.h>#include<stdio.h>#include<string.h>int search(char *input, char *key, int p);
void substring(char *test, char *temp, int h, int k);
int skip[256];
int main()
{
char str_input[100];
char str_key[50];
printf("请输入字串:");
gets_s(str_input);
printf("请输入关键字:");
gets_s(str_key);
int m, n;
char temp[80] = { '\0' };
m = strlen(str_input);
n = strlen(str_key);
int p;
p = search(str_input, str_key, n - 1);
while (p != -1)
{
substring(str_input, temp, p, m); //从匹配到的字串往后打印到结尾printf("%s\n", temp);
search(str_input, str_key, p + n + 1); //p+n+1 为下一次查找的起始位置
}
system("pause");
return0;
}
void table(char *key) {
int k, n;
n = strlen(key);
for (k = 0; k <= 255; k++)
{
skip[k] = n;
}
for (k = 0; k < n - 1; k++)
{
skip[key[k]] = n - k - 1;
//表示p在关键字第k个字符下一步前进的字符数//如 字串yangwenbin 关键字ang//a 对应2,n对应1 其他的前进3个字符也就是关键字长度
}
}
int search(char *input, char *key, int p)
{
int m,n;
char temp[80] = { '\0' };
m = strlen(input);
n = strlen(key);
while (p < m)
{
substring(input, temp, p - n + 1, p);
if (!strcmp(key, temp)) //判断temp与key是否相等,相等则执行if语句
{
return p - n + 1;
}
p += skip[input[p]];
//如yangwenbin 关键字为ang//第一次从n-1=2 (p在n位置)开始,yan与ang不匹配,跳到下一个位置p+=skip[input[p]]//skip[input[p]]=skip[input[2]]//即skip[input[p]]=skip['n'],字符n对应1,即p+1=3下个p的位置
}
return -1;
}
void substring(char *text, char *temp, int h, int k)
{
int i, j;
for (i = h, j = 0; i <= k; i++, j++)
{
temp[j] = text[i];
}
temp[j]= '\0';
}
python代码
# -*- coding: utf-8 -*-"""
Created on Sat Nov 4 20:22:59 2017
@author: yangwenbin
"""#import numpy as np
skip={}
deftable(key):for j in range(len(key)-1):
skip[key[j]]=len(key)-j-1pass#定义一个字典,key中的每个字符对应该字符前进的字符数目defsearch(str_Input,str_Key,p):
m=len(str_Input)
n=len(str_Key)
temp=[0]*len(str_key)
while p<m:
flag=True
sub_str(str_Input,temp,p-n+1,p)
if temp == list(str_Key):
return p-n+1##如p所在位置不是key中的字母,则p加上key的上度for i in range(n-1):
if str_Input[p]==str_Key[i]:
p+=skip[str_Input[p]]
flag=Falsepasspassif flag:
p+=n
passreturn -1defsub_str(text,temp,h,k):
a=list(range(h,k+1))
b=list(range(0,k))
ab=zip(a,b)
for i,j in ab:
temp[j]=text[i]
passif __name__=="__main__":
print("请输入字串:")
str_input=input()
print("请输入关键字:")
str_key=input()
table(str_key)
m=len(str_input)
n=len(str_key)
p=search(str_input,str_key,n-1)
temp=[0]*(m-p)
while p!=-1:
sub_str(str_input,temp,p,m-1)
#temp=temp.remove(0)#print (temp.remove(0))
print("".join('%s' %id for id in temp))
p=search(str_input,str_key,p+n+1)
temp=[0]*(m-p)
pass