3

2つの文字列がアナグラムであるかどうかを確認するための効率的な解決策を探していますが、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
}
4

4 に答える 4

1

アイスパックの反例は正しくありません。として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

于 2012-10-20T17:44:35.657 に答える
0

あなたの状態は十分ではありません。これは反対の例です: s1 = (1,5,3), s2 = (2,4,3)

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

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

于 2012-10-20T17:27:56.437 に答える
0

これは、アナグラムであるかどうかに関係なく、2つの文字列を見つける最も簡単な方法の1つです。

<?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"); 
}
?>
于 2013-08-06T13:02:11.100 に答える
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");
    }
}
于 2014-07-26T16:11:47.357 に答える