haskell 基礎題解(55)

2021-09-26 20:52:13 字數 1426 閱讀 1753

【題目】已知兩個串s1 和s2,求它們共同的子串中,最大長度是多少。

求的只是最大長度,並不要求找出是哪個子串(或哪些子串),應該比較容易一些。

簡單遞迴處理應該行得通,但效率就沒準兒了。

maxsub :

:string

->

string

->

intmaxsub _ =

0maxsub _ =

0maxsub xx@(x:xs) yy@(y:ys)

| x /

= y =

max f1 f2

| otherwise = maximum [f xs ys +

1, f1, f2]

where

f1 = maxsub xs yy

f2 = maxsub xx ys

f _ =

0 f _ =

0 f (p:ps)

(q:qs) | p /

= q =

0 | otherwise = f ps qs +

1

main :

: io (

)main =

doprint $ maxsub "abcd"

"ddbcdabd"

print $ maxsub "abcdefafabcd"

"xbcdefabcxdddd"

果不其然,執行太慢啊。

還不如直接笛卡爾積了,來乙個。

import data.list (tails, maximum)

maxsub :

:string

->

string

->

intmaxsub xs ys = maximum [f x y 0 | x <

- tails xs, y <

- tails ys]

where f _ n = n

f _ n = n

f (x:xs)

(y:ys) n

| x /

= y = n

| otherwise = f xs ys (n+1)

main :

: io (

)main =

doprint $ maxsub "aaaabbbbbcccccccccdddddddd"

"bbbaaaccccccccddddddddddaaa"

print $ maxsub "abcdefafabcd"

"xbcdefabcxdddd"

注意, 是 tails 不是 tail

實際上是把公共子串問題,轉化為最大公共字首問題了。

haskell 基礎題解(06)

題目 如果乙個數的所有真因子 不包含它自身的因子 之和恰等於其自身,則該數為完全數,也稱為完美數 perfect number 完全數有許多奇妙的性質。但它們很稀少,你來求前幾個吧。最小的乙個是 6,因為 6 1 2 3 這個完全數的定義已經很清楚了,如果沒有什麼妙法,就地毯式搜尋也可以。下法就是 ...

haskell 基礎題解(07)

題目 11 1 1 2 1 1 3 3 1 1 4 6 4 1 這個陣勢叫楊輝三角,國外叫帕斯卡三角。前一行的數字中,每兩個相鄰的數字相加就得到下一行的數字。左右兩邊的數永遠是 1 寫個程式,輸出前幾行的楊輝三角。import data.list intersperse yang hui int y...

haskell基礎題解(14)

題目 用自然數蛇形填充乙個 n 階的方陣。當n 5時,形如 這個問題用 haskell 解決時與 題目13 差別甚微。實際上,從函式式的思考習慣看,只要讓有些行作成後反轉一下就可以了。上 ju n f x x 0.n 1 where f row even row take n row n 1.odd...