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
这是正确的方法吗?
编辑:另一个似乎做得更好的建议是将字符串拆分为数组并对其进行排序。我认为这将节省更多的计算能力!
答案 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)
你可以将两个字符串放入变量并对其进行排序,然后进行比较。