从两个不同的字符串中删除一次相同的字符


Remove Same Character once from two different string

我需要PHP脚本方面的帮助。

我有两根绳子。

$string1 = "asdfgf";
$string2 = "asdfgasdg";

从两个字符串中删除同一个字符一次后,

$string1 = "f";
$string2 = "asdg";

另一个两字符串示例

$string1 = "sthnfr";
$string2 = "iserr";

输出

$string1 = "thnf"; // s and r removed
$string2 = "ier"; // s and r removed

我试着用str_replace替换所有的字符。感谢您的帮助

$string2 = "sthnfr";
$string1 = "iserr";
for($i = 0; $i < strlen($string1); )
{
    if(($pos = strpos($string2, $string1[$i])) !== false)
    {
        $string1 = substr($string1, 0, $i) . substr($string1, $i + 1);
        $string2 = substr($string2, 0, $pos) . substr($string2, $pos + 1);
        continue;
    }
    $i++;
}
  1. 对第一个字符串中的每个字符进行迭代(如果要处理具有多字节字符的字符串,请使用PHP7.4中的mb_str_split())。

  2. 将第二个字符串中第一个出现的孤立字符替换为空字符串;将替换次数限制为1次;并将替换成功暂时存储在CCD_ 2中。preg_quote()用于稳定模式并保护其不受正则表达式引擎具有特殊意义的字符的影响。同样,如果多字节字符是可能的,则在preg_replace()的第一个参数中的最后一个/之后添加u模式修饰符。

  3. 如果$count0,则不存在匹配,应将隔离字符附加到迭代重建的$newA字符串中。

使用这种技术,第一个字符串只会在遇到未找到的字符时变大,而第二个字符串只在遇到找到的字符后变小。换句话说,对于迭代的每个字符,第二个字符串要么失去一个字符,要么新的第一个字符串获得一个字符。

该技术用于清除两个字符串中的共享字符,而不考虑字符串中字符的顺序/位置。扩展到覆盖多字节场景也是非常容易的。

功能:(演示)

function removeSharedCharacters(string $a, string $b): array {
    $newA = '';
    foreach (str_split($a) as $char) {
        $b = preg_replace('/' . preg_quote($char, '/') . '/', '', $b, 1, $count);
        if (!$count) {
            $newA .= $char;
        }
    }
    return [$newA, $b];    
}

测试用例和函数调用:

$tests = [
    ["asdfgf", "asdfgasdg"],
    ["sthnfr", "iserr"],
    ["acegik", "jihgfedcba"]
];
foreach ($tests as $pair) {
    var_export(removeSharedCharacters(...$pair));
    echo "'n---'n";
}

输出:

array (
  0 => 'f',
  1 => 'asdg',
)
---
array (
  0 => 'thnf',
  1 => 'ier',
)
---
array (
  0 => 'k',
  1 => 'jhfdb',
)
---