对 Elixir 中的重复字母进行分组或计数

2023-12-21

我正在尝试计算 Elixir 中字符串上的重复字母。 我确实尝试过一些尝试,但到目前为止还没有成功。

我们以这个字符串为例:"AAABBAAC"

期望的输出是"3A2B2A1C".

将此字符串转换为List,我能够数出每个字母,结果是"5A2B1C",但我必须按照顺序数。

这是我正在做的代码:

string
|> String.graphemes
|> Enum.reduce([], fn(letter, acc) -> Keyword.update(acc, letter, 1, &(&1 + 1)) end)

但是,在我的测试中,我试图生成一个列表,如下所示["AAA", "BB", "AA", "C"],所以我可以轻松地计算String.lenght.

看起来像使用Enum.chunk_by我越来越接近解决方案了。

有办法生产这个吗?


如果使用递归方法实现此目的,则可以轻松跟踪最后出现的字符及其当前计数,以及保存到目前为止结果的累加器。如果当前字符等于最后一个字符,则只需增加计数即可。如果两者不同,则将最后一个字符及其计数添加到累加器中,然后继续处理下一个字符,直到字符串为空。最后,对最终值进行编码并返回结果。

defmodule RunLengthEncoding do
  # public interface, take first char and remember it as the current value
  def encode(<<char::utf8, rest::binary>>) do
    do_encode(rest, char, 1, "")
  end

  # current == last, increase the count and proceed
  defp do_encode(<<char::utf8, rest::binary>>, char, count, acc) do
    do_encode(rest, char, count + 1, acc)
  end

  # current != last, reset count, encode previous values and proceed
  defp do_encode(<<char::utf8, rest::binary>>, last, count, acc) do
    do_encode(rest, char, 1, acc <> to_string(count) <> <<last::utf8>>)
  end

  # input empty, encode final values and return
  defp do_encode("", last, count, acc) do
    acc <> to_string(count) <> <<last::utf8>>
  end
end
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对 Elixir 中的重复字母进行分组或计数 的相关文章

随机推荐