如何编写一个字符串等于允许最多一个字母不相等的函数?

时间:2017-09-20 02:26:27

标签: ruby

我使用的是Ruby 2.4。我想写一个比较字符串并声明它们的函数" equal"如果所有字符都匹配,或者两个字符串具有相同的字符数和除一个字符之外的所有字符匹配。例如,通过该逻辑,这些字符串将匹配

wonder
wander

唯一的区别是" o"和" a"。这些也匹配

zzz
zza

但这些不符合

abcdef
abcdef1

因为上面没有相同数量的字符。我该如何编写这样的函数?

5 个答案:

答案 0 :(得分:2)

这适用于您的特定情况:

def str_equal(a, b)
  a == b || (a.size == b.size && a.chars.map.with_index{|c, i| c == b[i]}.count(false) == 1)
end

答案 1 :(得分:1)

使用Ryan和nicooga的评论,以及必要的缺失部分:

使用meta的建议

更新了

def close_enough(str1, str2)
    return false unless str1.size == str2.size

    mismatches = str1
        .chars
        .zip(str2.chars)
        .count{ |(x, y)| x != y }

    (mismatches <= 1)
end

答案 2 :(得分:1)

当两个字符串的大小不同或者差异超过一个字符时,以下方法将返回false。我设计了一种方法,一旦确定要返回false,就会使计算短路,但仍能有效确定true返回值。

def at_most_one_character_different?(str1, str2)
  str1.size == str2.size &&
    (str1 == str2 || str1.size.times.one? { |i| str1[i] != str2[i] })
end

at_most_one_character_different? "", ""               #=> true
at_most_one_character_different? "humpty", "humpty"   #=> true
at_most_one_character_different? "humpty", "dumpty"   #=> true
at_most_one_character_different? "humpty", "dumbty"   #=> false
at_most_one_character_different? "humpty", "humptye"  #=> false

答案 3 :(得分:1)

如果您确定没有unicode或其他多字节字符,则可以通过比较字节而不是实际字符来获得较小的性能提升。 (仅仅因为所有其他质量答案都已被采纳)

 def at_most_one_byte_diff?(str1, str2)
   return false if str1.size != str2.size
   str1 == str2 || str1.each_byte.with_index.one? { |b,i| b != str2.getbyte(i) }
 end 

答案 4 :(得分:0)

您可以将差值计数作为参数传递:

<?php
$user_id = get_current_user_id();
$args = array( 'author' => $user_id, 'post_type' => 'any' );

// The Query
$the_query = new WP_Query( $args );

// The Loop
if ( $the_query->have_posts() ) {
    echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
    /* Restore original Post Data */
    wp_reset_postdata();
} else {
    // no posts found
}

?>