给定字符串,如何比较字符以查看是否存在重复项?

1 ruby algorithm

我正在尝试比较给定字符串中的字符,以查看是否存在重复项,如果要删除两个字符,则将字符串尽可能减小。例如。("ttyyzx")等于("zx")

我试过转换数组中的字符,然后使用#each_with_index来遍历字符。

arr = ("xxyz").split("")

  arr.each_with_index do |idx1, idx2|
    if idx1[idx2] == idx1[idx2 + 1]
      p idx1[idx2]
      p idx1[idx2 + 1]
    end
  end
Run Code Online (Sandbox Code Playgroud)

此时,我只希望能够在循环内打印数组中的下一个字符,因此我知道可以继续进行下一步,但是无论我使用什么代码,它都只会打印出第一个字符"x"

Ama*_*dan 5

要仅保留唯一字符(ggorlen的答案为“ b”):计算所有字符,仅查找出现一次的字符。我们依靠Ruby的Hash按插入顺序生成密钥。

def keep_unique_chars(str)
  str.each_char.
      with_object(Hash.new(0)) { |element, counts| counts[element] += 1 }.
      select { |_, count| count == 1 }.
      keys.
      join
end
Run Code Online (Sandbox Code Playgroud)

仅删除相邻的重复对象(ggorlen的答案是“ aba”):替换相邻重复的正则表达式可能是首选方法。

def remove_adjacent_dupes(str)
  str.gsub(/(.)\1+/, '')
end
Run Code Online (Sandbox Code Playgroud)

如果不使用正则表达式,则可以slice_when在字符更改时剪切数组,然后删除太长的组。有人可能认为flatten之前需要a join,但join不在乎:

def remove_adjacent_dupes_without_regexp(str)
  str.each_char.
      slice_when { |prev, curr| prev != curr }.
      select { |group| group.size == 1 }.
      join
end
Run Code Online (Sandbox Code Playgroud)