如何在两个随机字符串中找到相同的字符?(Ruby)

0ejtzxu1  于 2022-12-12  发布在  Ruby
关注(0)|答案(2)|浏览(146)

我正忙碌着解决我在网上发现的一些问题,我觉得这应该很简单,但我真的很挣扎。
假设您有字符串'AbcDeFg'和下一个字符串'HijKgLMnn',我希望能够在字符串中找到相同的字符,因此在本例中它将是'g'。
也许我没有提供足够的信息-我正在做代码降临,我在day 3上。我只需要在第一位的帮助,这是你得到的字符串-你必须把字符分成两半,然后比较两个字符串。你基本上必须得到两者之间的共同字符。这是我目前所拥有的:

file_data = File.read('Day_3_task1.txt')
arr = file_data.split("\n")

finals = []
arr.each do |x|
  len = x.length
  divided_by_two = len / 2
  second = x.slice!(divided_by_two..len).split('')
  first = x.split('')
  count = 0
  (0..len).each do |z|
    first.each do |y|
      if y == second[count]
        finals.push(y)
      end
    end
    count += 1
  end 
end

finals = finals.uniq

希望这对清晰度有帮助:)

6l7fqoea

6l7fqoea1#

您是否尝试过使用String#char方法将这两个字符串转换为数组,并找到这些数组的交集?如下所示:

string_one = 'AbcDeFg'.chars
string_two = 'HijKgLMnn'.chars
string_one & string_two # => ["g"]
wfveoks0

wfveoks02#

一种方法是将String#scan方法与正则表达式结合使用

rgx = /(.)(?!.*\1.*_)(?=.*_.*\1)/

我并不是提倡这种方法,我只是觉得有些读者可能会觉得有趣。
假设

str1 = 'AbcDgeFg'
str2 = 'HijKgLMnbn'

现在形成字符串

str = "#{str1}_#{str2}"
  #=> "AbcDeFg_HijKgLMnbn"

我假设字符串只包含字母,在str中,字符串可以用除字母以外的任何字符分隔。我使用了下划线。当然,如果字符串可以包含下划线,就必须使用不同的分隔符。
然后我们计算

str.scan(rgx).flatten
  #=> ["b", "g"]

需要数组#flatten,因为

str.scan(rgx)
  #=>[["b"], ["g"]]

正则表达式可以用 * 自由间距模式 * 编写,使其具有自文档性:

rgx =
  /
  (.)    # match any character, same to capture group 1
  (?!    # begin a negative lookahead
    .*   # match zero or more characters 
    \1   # match the contents of capture group 1
    .*   # match zero or more characters 
    _    # match an underscore
  )      # end the negative lookahead
  (?=    # begin a positive lookahead
    .*   # match zero or more characters 
    _    # match an underscore
    .*   # match zero or more characters 
    \1   # match the contents of capture group 1
  )      # end the positive lookahead
  /x     # invoke free-spacing regex definition mode

请注意,如果某个字符在str1中出现多次,并且在str2中至少出现一次,则负前瞻确保只匹配str1中的最后一个字符,以避免返回重复项。
或者,可以写

str.gsub(rgx).to_a

会使用String#gsub的(第四种)格式,此格式采用单一参数且不使用区块,并传回枚举值。

相关问题