下面是子串模式匹配程序。
def Index(s,t)
i=0
j=0
while i<=s.size-1 and j<=t.size-1
if s[i]==t[j]
i +=1
j+=1
else
i=i-j+2
j=1
end
end
if j>t.size-1
return i-(t.size-1)
end
end
str="abcde"
sub="de"
puts Index(str,sub)
测试程序如下:
C:\Users\16493\yang_code>ruby str_index.rb
4
--
kmp算法,因为书上存储字符串时,如存储"abc"
实际存储为:3abc
第一个位置存储的是长度,而在ruby中,字符串是从0开始存储的,数组存储在下标从0到size-1的区间内,所以这一点让我头痛极了。后来,想一个笨办法,在模式串和子串前面都加一个相同的字符,再套用书上的伪代码,总算弄出来了。其算法如下:
#因为字串的上标从0开始,而next[0]=0表示从头开始,两都不能区分,因此
#,决定在子串的开头,加一个辅助字符,辅助字符不参加匹配。只点位。
def Index_KMP(s,t,next2)
i=1
j=1
while i<=s.size-1 and j<=t.size-1
if j==0 or s[i]==t[j]
i+=1
j+=1
else
j=next2[j]
end
end
if j>(t.size-1)
return i-(t.size-1)
else
return -1
end
end
def get_next(t,next3)
i=1
next3[1]=0
j=0
while i<(t.size-1)
if j==0 or t[i]==t[j]
i += 1
j+=1
next3[i]=j
else
j=next3[j]
end
end
end
s="acabaabaabcacaabc"
t="abaabcac"
a=[0,0,0,0,0,0,0,0,0,0]
puts a.to_s
t[0,0]="x"
get_next(t,a)
puts a.to_s
s[0,0]="x"
puts Index_KMP(s,t,a)
执行结果如下:
C:\Users\16493\yang_code>ruby kmp.rb
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 1, 1, 2, 2, 3, 1, 2, 0]
6