PHP在随机位置比较两个字符串

时间:2014-08-31 05:32:29

标签: php

PHP比较两个字符串

示例我得到一个数字字符串

1 2 2 1  and another is 2 1 2 1

结果将是真实的,因为它只是1 2 2 1和2 2 1 1的位置洗牌

但如果值是

1 2 2 2 and another is 2 1 2 1

结果会返回false,因为在第一个字符串中它出现了3次出现2,无论我们如何将1 2 2 2位置移动它都不会给出2 1 2 1

另一个可能的例子是

1 2 3 1 and another is 1 2 3 3

结果也是假的,因为无论我们如何洗牌1231都不会给我们1233

我怎么能做这个比较,有没有任何PHP函数可以比较一个shuffle字符串与非shuffle字符串

也许我可以使用str_shuffle并执行数组推送,直到我得到24个字符串组合。

$input_string = "1221";
$array_string = ();

while( count($array_string) != 24 )
{
    $input_string = str_shuffle($input_string);
    array_push($array_string, $input_string);
    $array_string = array_unique($array_string);
}

//then lastly i check if compare string is in array

这是正确的方法吗?

编辑:另一个似乎做得更好的建议是将字符串拆分为数组并对其进行排序。我认为这将节省更多的计算能力!

6 个答案:

答案 0 :(得分:6)

$string1 = "1122";
$string1 = str_split($string1);
sort($string1);

$string2 = "1212";
$string2 = str_split($string2);
sort($string2);

if ($string1 == $string2) {
    echo "true";
} else {
    echo "false";
}

这是一个返回true的示例

答案 1 :(得分:1)

您可以通过首先对两个列表进行排序然后比较它们来比较2个列表的内容而不管订单是否非常有效。如果两个排序版本相同,则可以将一个字符串混洗到另一个字符串中。

这实际上称为anagram(也可以用字母来完成)。

如果数字都是单个数字,那么您可以对字符串中的字符进行排序。如果字母是多个数字,那么您必须首先构造一个整数数组并对它们进行排序。

需要多长时间

此方法需要的时间与length * log(length)成比例(其中length是字符串的长度),因为这是排序所需的时间。这就是算法具有时间复杂度O(n lg(n))

答案 2 :(得分:1)

你想要的是检查数字字符串是否是另一个的字谜。您可以将每个数字映射到素数,获取映射数字的乘积,然后执行相等。可以使用相同的想法使其适用于字母数字字符串。这对长字符串不起作用,因为这将导致整数溢出。如果你预期长字符串,计数方法会更好。与拆分,排序和比较两个数组不同,它在O(n)中运行。

$primeMap = array(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);

function isNumericAnagram ($n1, $n2) {
  if(strlen($n1) !== strlen($n2)) return false;
  $p1 = $p2 = 1;
  for($i = 0; $i < strlen($n1); $i ++) {
    $p1 *= $primeMap[$n1[$i]];
    $p2 *= $primeMap[$n2[$i]];
  }
  return $p1 === $p2;

}


isNumericAnagram ('1234', '3214'); //true
isNumericAnagram ('12534', '35214'); //true
isNumericAnagram ('0000', '0000'); //true
isNumericAnagram ('11', '1'); //false

从算术的基本定理,

  

任何大于1的整数都可以写为唯一的产品(最多为   素数的排序

答案 3 :(得分:1)

我在这里做的假设是你的字符串只包含数字和空格字符,数字用空格分隔(即它们都是整数值)。鉴于这些假设,假设您正在寻求解决此问题的最佳方法,我的解决方案将如下。

/**
*
*  A function that returns TRUE or FALSE if both strings
*  are an anagram. Assumed space-delimited integer strings.
*
*/
function identStrings($string1, $string2) {

    $token = strtok($string1, " "); // tokenize the string by spaces
    $numbers = array_map('intval',array_filter(explode(' ', $string2)));

    while($token !== false) {

        if (!$token)
            continue;

        if (($key = array_search((int)$token, $numbers)) === false)
            return false;
        else
            unset($numbers[$key]);

        $token = strtok(" ");
    }

    return true;
}

$string1 = "1 2 2 2";
$string2 = "2 1 2 1";

if (identStrings($string1, $string2)) {
    echo "These strings are identical!";
} else {
    echo "These strings are not identical...";
}

答案 4 :(得分:1)

使用一些不同逻辑的另一种解决方案:

$str1 = "1 2 3 1";
$str2 = "1 1 3 2";

function sameStrings($str1, $str2)
{
    //check for the string lengths first
    if(strlen($str1) != strlen($str2))
        return false;

    $strArr = explode(' ', $str1);
    $occArr = array();

    //Get occurances of all numbers in the first string
    foreach($strArr as $str) $occArr[$str] = $occArr[$str]+1;

    //compare them with the second string, if the length of an of those numbers is not corrct then its false
    foreach($occArr as $num => $occ)
    {
        if(substr_count($str2, $num) != $occ)
            return false;
    }

    return true;
}

echo sameStrings($str1, $str2);

答案 5 :(得分:0)

你可以将两个字符串放入变量并对其进行排序,然后进行比较。