时间复杂度为m+n,的一种模式匹配,适合子串不是很长的匹配
2015-08-23 10:30
363 查看
子串长度应该小于 (int类型表示最大值)/256
//自己想出来的模式匹配算法,记得在蓝桥杯比赛中用过,方法应该早就存在了,我也不知道叫什么
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int KMP_ADD(char * s ,char * t ,int pos) ;//返回pos之后的子串t在主串s中第一次出现的位置,不存在返回-1
int main (){
int i ;
i = KMP_ADD("1234123","123" ,0);
printf("%d" , i) ;
return 0;
}
int KMP_ADD(char * s ,char * t ,int pos){
int s_l = strlen(s) ;
int t_l = strlen (t) ;
// printf("%d %d \n",s_l,t_l);
int i , j , t_sum,s_sum ;
char *sc ;
sc = (char*)malloc ((t_l+1)*sizeof(char)) ;
if (sc == NULL)
return -1 ;
if (s_l-pos < t_l)
return -1;
for( i =0 ,t_sum = 0; i<t_l ; i ++){
t_sum+=t[i] ;
}
for (i=pos,s_sum=0 ; i<s_l ; i++){
s_sum+=s[i] ;
if (i>=pos+t_l-1){
if (s_sum == t_sum){
strcpy(sc,&s[i-t_l+1]);
sc[t_l] = '\0';
if (!strcmp(sc,t)){
free(sc);
return i-t_l+1;
}else{
s_sum -= s[i-t_l+1];
}
}else{
s_sum -= s[i-t_l+1];
}
}
}
free(sc);
return -1;
}
//自己想出来的模式匹配算法,记得在蓝桥杯比赛中用过,方法应该早就存在了,我也不知道叫什么
#include<stdio.h>
#include<string.h>
#include<malloc.h>
int KMP_ADD(char * s ,char * t ,int pos) ;//返回pos之后的子串t在主串s中第一次出现的位置,不存在返回-1
int main (){
int i ;
i = KMP_ADD("1234123","123" ,0);
printf("%d" , i) ;
return 0;
}
int KMP_ADD(char * s ,char * t ,int pos){
int s_l = strlen(s) ;
int t_l = strlen (t) ;
// printf("%d %d \n",s_l,t_l);
int i , j , t_sum,s_sum ;
char *sc ;
sc = (char*)malloc ((t_l+1)*sizeof(char)) ;
if (sc == NULL)
return -1 ;
if (s_l-pos < t_l)
return -1;
for( i =0 ,t_sum = 0; i<t_l ; i ++){
t_sum+=t[i] ;
}
for (i=pos,s_sum=0 ; i<s_l ; i++){
s_sum+=s[i] ;
if (i>=pos+t_l-1){
if (s_sum == t_sum){
strcpy(sc,&s[i-t_l+1]);
sc[t_l] = '\0';
if (!strcmp(sc,t)){
free(sc);
return i-t_l+1;
}else{
s_sum -= s[i-t_l+1];
}
}else{
s_sum -= s[i-t_l+1];
}
}
}
free(sc);
return -1;
}
相关文章推荐
- 拷贝构造函数(复制构造函数)
- HDOJ 5417 Victor and Machine 水
- 暑期留校之iOS学习笔记之视图控制器(UI)
- HDU 1496 Equations(哈希打表+二分暴力)
- 树莓派版本
- POJ1759--Garland
- Leetcode: Binary Tree Level Order Traversal II
- Java反射
- 运算符的优先级和结合性
- Android 快速开发系列 打造万能的ListView GridView 适配器
- C++中GB2312字符串和UTF-8之间的转换 从CString 的转换
- 数据库常用高级用法(不定期更新)
- 【JsvaScript】——运算符
- CDP(思科发现协议)
- CodeForces 558A Lala Land and Apple Trees(模拟)
- Swift版知乎日报
- POJ 2386 Lake Counting
- iOS发展 - 使用您自己的自定义字体
- Catalyst交换机安全配置
- MySQL中的运算符使用实例展示