模式匹配与生成树算法解析

102、定义一个名为 first - sublist - match 的过程,该过程接收两个列表,一个模式列表和一个文本列表,返回文本中与模式匹配的子列表开始的最小位置;如果不存在这样的位置,则返回 #f。该过程应在计算出该值后立即返回,无需检查文本中的后续位置。

以下是实现 first-sublist-match 过程的代码:

(define (first-sublist-match pattern text)
  (let ((last-position (- (length text) (length pattern))))
    ((rec (searcher start)
       (cond 
         ((> start last-position) #f)
         ((matches-prefix? pattern (list-tail text start)) start)
         (else (searcher (+ start 1))))) 
     0)))

此代码中,首先计算出文本中可能匹配的最后位置。接着使用递归的 searcher 过程从文本起始位置开始检查。若当前位置超出最后可能匹配的位置,返回 #f ;若当前位置开始的子列表与模式匹配,返回该位置;否则,继续检查下一个位置。

103、对于模式 (list ’alpha ’beta ’gamma ’delta ’alpha ’beta ’gamma ’alpha ’beta ’alpha),这里的前缀函数指模式串中每个位置之前的子串的最长公共前后缀长度。手动计算从 0 到 10 的自然数作为参数对应的前缀函数值。

需通过如下步骤计算:

  1. 对于 0,前缀为空串,最长公共前后缀长度为 0。
  2. 从 1 开始,依次计算每个位置之前子串的最长公共前后缀长度。

例如:

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值