ERLANG

时间:2017-10-27 09:53:46

标签: string erlang

我正在尝试制作一个函数:

  • 输入:一些字符串(例如:“thisis_a_string123”,“thisis_a_nother_string123”,“thisis_not_a_string123”)
  • 输出:从第一个字符开始计算的最长子字符串(例如:“thisis_”),如果找不到,则返回一个空字符串:“”。

由于输出只是:“thisis_”,而不是像这样的最长公共子序列:“thisis_a_string123”,所以它与以下内容不同: https://rosettacode.org/wiki/Longest_common_subsequence

并且: Getting the longest common subsequence in ERLANG

任何帮助将不胜感激,谢谢!!

2 个答案:

答案 0 :(得分:2)

根据我的理解,您需要最长的常见前缀,而不是子字符串。这可以通过首先定义一个与2个列表一起使用的函数来完成:

lcp([X | XS], [X | YS]) ->
  [X | lcp(XS, YS)];
lcp(_, _) ->
  [].

然后使用lists:foldl将其应用于列表列表:

lcp([X | XS]) ->
  lists:foldl(fun lcp/2, X, XS).
1> a:lcp(["thisis_a_string123", "thisis_a_nother_string123", "thisis_not_a_string123"]).
"thisis_"
2> a:lcp(["thisis_a_string123", "thisis_a_nother_string123", "thisis_not_a_string123", "xyz"]).
[]

答案 1 :(得分:0)

对于任意数量的字符串:

lcp([]) -> [];
lcp([S]) -> S;
lcp(L) -> lcp_(L).

lcp_([[H|T]|R]) ->
  case strip(H, R, []) of
    false -> [];
    Ts -> [H|lcp_([T|Ts])]
  end.

strip(_, [], Ts) -> Ts;
strip(H, [[H|T]|R], Ts) -> strip(H, R, [T|Ts]);
strip(_, _, _) -> false.