OCaml搜索最长的子序列

时间:2013-10-26 21:03:15

标签: list ocaml

我尝试在列表中找到增长最长的子序列。 我有问题吗? 有什么建议 ? 例如

[-5;6;7;8;-1;6;7;8;9;10;11;12]
The answer should be [-1;6;7;8;9;10;11;12]

1 个答案:

答案 0 :(得分:1)

以下代码片段回答了您的问题,恕我直言。

let longest l =
  let rec aux nbest best ncurr curr = function
    | [] -> List.rev best
    | hd :: tl when hd <= List.hd curr -> (* new sequence *)
        aux nbest best 1 [hd] tl
    | hd :: tl when nbest > ncurr ->
        aux nbest best (ncurr + 1) (hd :: curr) tl
    | hd :: tl ->
        aux (ncurr + 1) (hd :: curr) (ncurr + 1) (hd :: curr) tl
  in
  if l = [] then [] else aux 1 [List.hd l] 1 [List.hd l] (List.tl l)

let test = [-5; 6; 7; 8; -1; 6; 7; 8; 9; 10; 11; 12]

let () =
  List.iter (Printf.printf "%i ") (longest test)

请注意,它将返回第一个严格增加的序列,并且nbest和ncurr仅出于性能原因而存在。我没有看到任何避免List.rev操作的方法。该函数是尾递归的。