gem algorithms010 读代码后试着写

    

下面是子串模式匹配程序。
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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值