【題目】已知兩個串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...