Ruby 中的字符串比较

String comparison in Ruby

我尝试匹配

的一些条件

我已尝试根据这些条件进行匹配,但在测试长字符串或奇数字符串比较时仍然遇到问题。

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

据我了解,您有两个字符串,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 

我已经在 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;
}