加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 最长的公共前缀和数组后缀

发布时间:2020-12-17 02:47:34 所属栏目:百科 来源:网络整理
导读:获取两个数组的最长公共前缀(从原始索引0开始的子数组)和后缀(以原始索引-1结尾的子数组)的最佳方法是什么?例如,给定两个数组: [:foo,1,:foo,nil,:bar,"baz",false][:foo,true,false] 这些数组的最长公共前缀是: [:foo,0] 并且这些数组的最长公共后缀是:
获取两个数组的最长公共前缀(从原始索引0开始的子数组)和后缀(以原始索引-1结尾的子数组)的最佳方法是什么?例如,给定两个数组:

[:foo,1,:foo,nil,:bar,"baz",false]
[:foo,true,false]

这些数组的最长公共前缀是:

[:foo,0]

并且这些数组的最长公共后缀是:

[false]

当索引0 / -1处的元素在原始数组中不同时,公共前缀/后缀应该是空数组.

解决方法

一种可能的方案:

a1 = [:foo,false]
a2 = [:foo,false]

a1.zip(a2).take_while { |x,y| x == y }.map(&:first)
#=> [:foo,0]

反转输入数组和输出数组会找到一个公共后缀:

a1.reverse.zip(a2.reverse).take_while { |x,y| x == y }.map(&:first).reverse
#=> [false]

边缘情况:zip填充带有nil值的“argument”数组:

a1 = [true,nil]
a2 = [true]

a1.zip(a2).take_while { |x,y| x == y }.map(&:first)
#=> [true,nil]

通过将初始数组截断为第二个数组的长度可以避免这种情况:

a1[0...a2.size].zip(a2).take_while { |x,y| x == y }.map(&:first)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读