Ruby 中的字符串比较
String comparison in Ruby
我尝试匹配
的一些条件
- 字符串中的每个字母实例只能参与一次匹配。
- 如果字母实例可以参与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
据我了解,您有两个字符串,s1
和 s2
,您从中获得两个字符串:
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;
}
我尝试匹配
的一些条件- 字符串中的每个字母实例只能参与一次匹配。
- 如果字母实例可以参与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
据我了解,您有两个字符串,s1
和 s2
,您从中获得两个字符串:
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;
}