【问题标题】:is this the best anagram checking solution?这是最好的字谜检查解决方案吗?
【发布时间】:2012-10-11 01:04:07
【问题描述】:

我正在寻找一种有效的解决方案来检查两个字符串是否是字谜,但字符表/字典检查可能不是 unicode 的好解决方案。我想出了一个解决方案,但我不知道如何证明它在数学上是正确的。公式表达为“ (a + b) = (c + d) 和 a 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
}

【问题讨论】:

  • 你可以把它从 O(n) 降到 O(n/2)
  • @shyam O(n) = O(n/2)(同一类)

标签: anagram


【解决方案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

【讨论】:

  • 感谢您的回答,但在实际情况下,所有字符的值都大于零。我希望你举一个没有零值的例子。
  • 没问题,s1 = (5, 2), s2 = (3, 4)呢?希望能解决这个问题。
  • 很高兴您喜欢它,如果您能选择我的解决方案作为您问题的答案,那就太好了。
  • 我假设问题中的 XOR 不是按位而是按值。
【解决方案2】:

你的条件不够好。 这是一个相反的例子: s1 = (1,5,3), s2 = (2,4,3)

1+5+3=9=2+4+3

1 ^ 5 ^ 3 ^ 2 ^ 4 ^ 3 = 0

【讨论】:

  • 这适用于 valuewise XOR。对于按位,正确的示例是上面的示例。
【解决方案3】:

这是查找两个字符串是否为字谜的最简单方法之一。

<?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"); 
}
?>

【讨论】:

    【解决方案4】:
    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");
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 1970-01-01
      • 1970-01-01
      • 2012-02-18
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多