Ruby中的字符串比较

时间:2015-01-12 05:36:00

标签: ruby string

我尝试匹配

的某些条件
  • 字符串中的每个字母实例只能参与一个匹配。
  • 如果一个字母实例可以参与n1或n2,那么它将被计入n1。
  • 这两个字符串的长度可能相同,也可能不同。

我尝试在这些条件的基础上进行匹配,在测试长字符串或奇数字符串比较时仍然遇到问题。

def matchval_not_pos(str1, str2)
  a1, a2 = str1.chars, str2.chars
  [a1.size, a2.size].min.times do |i|
    if a1[i] == a2[i]
      a1.delete_at(i)
      a2.delete_at(i)
    end
  end
  a1.reduce(0) do |t,c|
    i = a2.index(c)
    if i
      inc = 1
      a2.delete_at(i)
    else
      inc = 0
    end
    t + inc
  end
end


Some examples (str1, str2 -> n1,n2):

"abc", "abc" -> 3,0
"bca", "abc" -> 0,3
"aab", "abb" -> 2,0
"aab", "aba" -> 1,2
"abc", "aaa" -> 1,0

2 个答案:

答案 0 :(得分:1)

据我了解,您有两个字符串,s1s2,您可以从中获得两个字符串:

ss1 = s1[0,n]
ss2 = s2[0,n]

,其中

n = [s1.size, s2.size].min

并且您想知道ss2的字符是否可以重新排列为ss1。如果我的理解是正确的,那么当且仅当以下情况属实时才是真的:

ss1.chars.sort == ss2.chars.sort

示例:

s1 = "ebcda"
s2 = "adcbefr"
n = [s1.size, s2.size].min       #=> 5 
ss1 = s1[0,n]                    #=> "ebcda" 
ss2 = s2[0,n]                    #=> "adcbe" 
ss1.chars.sort == ss2.chars.sort #=> true 

答案 1 :(得分:0)

我已经用PHP创建了脚本。以下是我的要求,该要求几乎与此线程相似。

n1:一个字符串中字母的数量,每个字母的值和 在另一个字符串中的字母位置。

n2:一个字符串中字母的数量,每个字母的值都匹配, 但不在其他字符串中的字母位置。

一些注意事项: *如果两个字符串被交换,输出应该是相同的 *字符串中的每个字母实例只能参加一场比赛。 *如果一个字母实例可以参与n1或n2,则应计入n1。 *这两个字符串的长度可以相同,也可以不同。

也用许多类似下面的单词进行了测试:

string_matcher('bca', 'abc');
string_matcher('aab', 'abb');
string_matcher('aab', 'aba');
string_matcher('abc', 'aaa');
string_matcher('ebcda', 'adcbefr');
string_matcher('prashant', 'gautam');
string_matcher('language', 'awesome');
string_matcher('masterpiece', 'effective');
string_matcher('Fabulous','regression');
string_matcher('regression','religion');

function string_matcher($s1, $s2)
{
    $n1 = $n2 = 0;

    $arrS1 = str_split($s1);
    $arrS2 = str_split($s2);

    $minLen = min(array(count($arrS1), count($arrS2)));
    for ($i=0; $i<$minLen; $i++){
        if($arrS1[$i] == $arrS2[$i]){
            $n1++;
            unset($arrS1[$i], $arrS2[$i]);
        }
    }  

    $arrS1 = array_values($arrS1);
    $arrS2 = array_values($arrS2);

    while(true){
        if(count($arrS1) && count($arrS2)){
            if(in_array($arrS1[0], $arrS2)){
                $position = array_search($arrS1[0], $arrS2);
                $n2++;
                unset($arrS1[0], $arrS2[$position]);
            } else{
                unset($arrS1[0]);
            }
            $arrS1 = array_values(array_filter($arrS1));
            $arrS2 = array_values(array_filter($arrS2));
        } else{
            break;
        }
    }

    echo '<hr>“'.$s1.'”, “'.$s2.'” -> '.$n1.','.$n2;
}