1

文字列を受け取り、Luaで重複文字を削除して返す関数を作成する必要があります。私が助けを必要としているのは...

  • 文字とカウントでハッシュを作成する
  • 各文字を1つだけに等しくし、複数のオカレンスを削除します
  • 重複を削除してハッシュを新しい文字列に変換する

簡単な関数/アルゴリズムをいただければ幸いです。

4

1 に答える 1

4

各文字のインスタンスが1つだけ必要な場合は、カウントを追跡する必要はおそらくありません。入力文字列を、出力の生成に使用したのと同じテーブルと比較できます。

local function contains(tbl, val)
  for k,v in pairs(tbl) do 
    if v == val then return true end
  end
  return false
end

local function uniq(str)
  local out = {}
  for s in str:gmatch(".") do
    if not contains(out, s) then out[#out+1] = s end
  end
  return table.concat(out)
end

print( uniq("the quick brown fox jumps over the lazy dog") )
-- the quickbrownfxjmpsvlazydg

これはおそらく短い文字列の場合の以下の関数よりも遅くなりますが、ここで概説する理由により、Luaでの過度の文字列連結を回避するのが一般的に最善です。出力文字列がかなり短くなることが確実な場合は、これを削除contains()して使用できます。

local function uniq(str)
  local out = ""
  for s in str:gmatch(".") do
    if not out:find(s) then out = out .. s end
  end
  return out
end
于 2012-07-27T04:53:23.643 に答える