在Ruby

时间:2015-07-30 03:01:17

标签: ruby string

我有两个字符串。

str_a = "the_quick_brown_fox"
str_b = "the_quick_red_fox"

我想找到两个字符串不同的第一个索引(即str_a[i] != str_b[i])。

我知道我可以通过以下方式解决这个问题:

def diff_char_index(str_a, str_b)
  arr_a, arr_b = str_a.split(""), str_b.split("")
  return -1 unless valid_string?(str_a) && valid_string?(str_b)
  arr_a.each_index do |i|
    return i unless arr_a[i] == arr_b[i]
  end
end

def valid_string?(str)
  return false unless str.is_a?(String)
  return false unless str.size > 0
  true
end

diff_char_index(str_a, str_b) # => 10

有更好的方法吗?

4 个答案:

答案 0 :(得分:7)

这样的事情应该有效:

str_a.each_char.with_index
  .find_index {|char, idx| char != str_b[idx] } || str_a.size

修改:有效:http://ideone.com/Ttwu1x
修改2 :如果nil短于str_a,我的原始代码会返回str_b。我已将其更新为正常工作(它将返回str_a.size,因此,如果str_a中的最后一个索引为3,则返回4)。

这是另一种可能稍微简单一些的方法:

(0...str_a.size).find {|i| str_a[i] != str_b[i] } || str_a.size

http://ideone.com/275cEU

答案 1 :(得分:1)

i = 0
i += 1 while str_a[i] and str_a[i] == str_b[i]
i

答案 2 :(得分:1)

str_a = "the_quick_brown_dog"
str_b = "the_quick_red_dog"

(0..(1.0)/0).find { |i| (str_a[i] != str_b[i]) || str_a[i].nil? }
  #=> 10

str_a = "the_quick_brown_dog"
str_b = "the_quick_brown_dog"

(0..(1.0)/0).find { |i| (str_a[i] != str_b[i]) || str_a[i].nil? }
  #=> 19
str_a.size
  #=> 19 

答案 3 :(得分:0)

这使用二进制搜索来查找str_a开头不再出现str_b切片的索引:

(0..str_a.length).bsearch { |i| str_b.rindex(str_a[0..i]) != 0 }