博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
kmp算法实现
阅读量:6280 次
发布时间:2019-06-22

本文共 1668 字,大约阅读时间需要 5 分钟。

  hot3.png

这是上篇kmp算法根据阮景峰博客的教程实现的。

#include
#include
int fun( char *str , int len );//计算字符串str的部分匹配值,存储在arry数组里void comp( char *str , int len , int arry[] ){ int i = 0 , j = 0; char tmp[ len ]; strcpy( tmp , str ); for( i = 1 ; i < len + 1 ; i++ ) { tmp[ i ] = '\0'; arry[ i - 1 ] = fun( tmp , i ); strcpy( tmp , str ); }}int fun( char *str , int len ){ int i = 0; int j = 0; int count = 0; //j是计算部分匹配的次数 for( j = 1 ; j < len ; j++ ) { for( i = 0 ; i < j ; i++ ) { if( str[ i ] != str[ len - j + i ] ) //str[i]是前缀开始的,str[ len - j + i ]是从后缀开始的 break; else  { if( i == j - 1 ) { count = i + 1 > count ? i + 1 : count; //因为"部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度 } } } } return count;}int kmp( char *des , char *src , int arry[] ){ int i = 0 , j = 0; int len_des = strlen( des ); while( src[ i ] ) { if( src[ i ] != des[ j ] ) { if( j == 0 ) { i += 1; } else { i = ( i - j ) + ( j - arry[ j - 1 ] );       //这句很关键,移动的字符串的子串,移动的位数是已匹配的字符数 - 对应数组的值 j = 0; } continue; } if( j == len_des - 1 ) { printf( "FIND IT , at position: %d\n" , i - j + 1 ); printf( "%s\n" , src ); for( j = 0 ; j < i - len_des + 1 ; j++ ) printf( "%c" , ' ' ); printf( "%s\n" , des ); return 0; } i++; j++; } printf("Not find it!\n"); return 1;}int main(){ char *des = "ABCDABD"; char *src = "BBC ABCDAB ABCDABCDABDE"; // char *des = "abaabcac"; // char *src = "acabaabaabcacaabc"; int arry[ strlen( des ) ]; comp( des , strlen( des ) , arry ); int i = 0; for( i = 0 ; i < strlen( des ) ; i++ ) printf( "%d\n" , arry[ i ] ); kmp( des , src , arry ); return 0;}

转载于:https://my.oschina.net/nibnat/blog/197399

你可能感兴趣的文章
精度 Precision
查看>>
Android——4.2 - 3G移植之路之 APN (五)
查看>>
Linux_DHCP服务搭建
查看>>
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
翻译 | 摆脱浏览器限制的JavaScript
查看>>
闲扯下午引爆乌云社区“盗窃”乌云币事件
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
网吧维护工具
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>