我正在寻找一种有效的解决方案来检查两个字符串是否是字谜,但是char表/字典检查可能不是unicode的好解决方案。我提出了一个解决方案,但我不知道如何证明它在数学上是正确的。该公式表示为“(a + b)=(c + d)和XOR b XOR c XOR d = 0 ==>(a,b)和(c,d)是字形”。也许你可以帮助我。以下是一个实现。
def isAnagram(s1: String, s2: String): Boolean = {
if (s1.length != s2.length) return false
else {
var numVal = 0
var bitVal = 0
for (i <- 0 until s1.length) {
numVal += s1(i) - s2(i)
bitVal ^= s1(i) ^ s2(i)
}
return numVal == 0 && bitVal == 0
}
答案 0 :(得分:1)
icepack的计数器示例不正确,为1 ^ 5 ^ 3 ^ 2 ^ 4 ^ 3 = 2
,而不是0
。
以下是一个更好的反例:s1 = (5, 0, 5)
和s2 = (1, 4, 5)
。
5 + 0 + 5 = 1 + 4 + 5
5 ^ 0 ^ 5 ^ 1 ^ 4 ^ 5 = 0
答案 1 :(得分:0)
你的条件不够好。
这是一个相反的例子:
s1 = (1,5,3), s2 = (2,4,3)
1+5+3=9=2+4+3
1 ^ 5 ^ 3 ^ 2 ^ 4 ^ 3 = 0
答案 2 :(得分:0)
这是找到两个字符串的最简单方法之一是anagram。
<?php
$str1=$_POST['str1'];
$str2=$_POST['str2'];
$arr1=str_split($str1);
$arr2=str_split($str2);
sort($arr1);
sort($arr2);
echo (($arr1==$arr2) ? "The given string is anagram" : "The given string is not a anagram");
}
?>
答案 3 :(得分:0)
import java.util.Arrays;
import java.util.Scanner;
public class anagram {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("Enter 1st String");
String r1=sc.nextLine();
System.out.println("Enter 2nd String");
String r2=sc.nextLine();
if(r1.length()!=r2.length()) System.out.println("not a Anagram");
char[] s1=r1.toCharArray();
char[] s2=r2.toCharArray();
Arrays.sort(s1);
Arrays.sort(s2);
boolean f= Arrays.equals(s1, s2);
if(f==false) System.out.println("not a Anagram");
else System.out.println("its a Anagram");
}
}