- 论坛徽章:
- 2
|
简单地实现了KMP的算法,有待优化完善,有精力的童鞋们继续~- # KMP algorithm
- function buildindex(s){
- L=split(s,arr,"")
- ind[1] = 0
- for(i = 2; i <= L; i++){
- for(j=1;j<=L;j++){
- if(arr[i] == arr[j]){
- ind[i] = 1
- for(k=1;k<=L-j;k++){
- if(arr[k+i] == arr[j+k] && j+k <= L){
- ind[i+k] = ind[i+k-1] + 1
- }else{
- i+=k-1
- j=k=L+1
- }
- }
- }else{
- ind[i] = 0
- j=L+1
- }
- }
- }
- #for(i = 1; i <= L; i++)
- #print arr[i],ind[i]
- }
- function kmp(string,text){
- print "string:\t"string
- print "text:\t"text
- Len_s = split(string,arr_s,"")
- Len_text = split(text,arr_text,"")
- for(i=1; i<=Len_text; i++){
- for(j=1;j<=Len_s;j++){
- if(arr_s[j] == arr_text[i]){
- for(k=1;k<=Len_s-1;k++){
- if(arr_s[j+k] != arr_text[i+k]){
- i = i+(k-ind[k])
- j = k = Len_s + 1
- }
- }
- if(k == Len_s){
- print "MATCHED!!!"
- printf ("%s\033[31;1m%s\033[0m%s",substr(text,1,i-1),substr(text,i,Len_s),substr(text,i+1))
- exit
- }
- }else{
- j = Len_s
- }
- }
- }
- print "NOT MATCHED!!!"
- }
- BEGIN{
- text_string = "BBC ABCDAB ABCDABDDABDE"
- searcing_string = "ABCDABD"
- buildindex(searcing_string)
- kmp(searcing_string,text_string)
- }
复制代码
awk -f kmp.awk
string: ABCDABD
text: BBC ABCDAB ABCDABDDABDE
MATCHED!!!
BBC ABCDAB ABCDABDBCDABDDABDE
|
|