1

你将如何定义一个接受两个字符串的函数,比如字符串 x 和字符串 y,并返回第一个字符串(字符串 x)末尾与第二个字符串开头(第二个 y)重叠的元素数。

我认为使用前奏中的 isPrefixOf 来执行此操作是个好主意,因为它会检查一个字符串是否在另一个字符串中,如果是则返回 True 否则返回 False 。但是我对如何返回有多少元素重叠的计数有点困惑。我根据我认为您将如何解决问题编写了一些伪代码。

countElements :: Eq a => (Str a, Str a) -> Int
countElements (x,y) = 
     if x `isPrefixOf` y == True
         then return the count of how many elements overlap
     otherwise 0

示例输出为:

countElements (board, directors) = 1
countElements (bend, ending) = 3

这里有什么帮助吗?我不太擅长编写 Haskell 代码。

4

2 回答 2

4

您的想法完全正确,但是您的伪代码忽略了这样一个事实,即您必须迭代传递给函数的第一个字符串的所有可能尾部。

countElements :: String -> String -> Int
countElements s t = length $ head $ filter (`isPrefixOf` t) (tails s)

> countElements "board" "directors"
1
> countElements "bend" "endings"
3
于 2012-10-08T05:40:09.060 回答
3

没有的版本isPrefixOf

import Data.List

countElements xs ys = length . fst . last . filter (uncurry (==)) $ zip (reverse $ tails xs) (inits ys)
于 2012-10-08T07:21:28.867 回答