我有两个字符串。
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
有更好的方法吗?
答案 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
答案 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 }