0

私はPythonを学ぼうとしています。次の C の単純なアナグラム チェッカーを考えてみましょう。

bool are_anagrams(const char* str1, const char* str2)
{
  int str1_count[NUM_CHARS] = {0};
  int str2_count[NUM_CHARS] = {0};

  for(int i = 0; i < strlen(str1); i++)
  {
    str1_count[str1[i] - 'a']++;
  } 
  for(int i = 0; i < strlen(str2); i++)
  {
    str2_count[str2[i] - 'a']++;
  }

  for(int i = 0; i < NUM_CHARS; i++)
  {
    if(str1_count[i] != str2_count[i])
      { return false; }
  }

  return true;
}

具体的には、ラインstr1_count[str2[i] - 'a']++は Python でどのように行われますか?

4

3 に答える 3

5

具体的には、ラインstr1_count[str2[i] - 'a']++は Python でどのように行われますか?

そうではありません。Pythonにはdict、このようなことを処理するための機能があります。

str1_count = {}
 ...
str1_count[char2] += 1

ただしcollections.defaultdict、通常は新しいキーの場合を処理するために使用されます。

str1_count = collections.defaultdict(int)
于 2012-07-02T00:02:14.670 に答える
3

Python のこの単純なアナグラム チェッカーを検討してください。

from collections import Counter
def are_anagrams(str1, str2):
    return Counter(str1) == Counter(str2)

それをどのようにCに変換しますか?(これは C バージョンと同じアルゴリズムを使用しています)

あなたの質問に答えるには、使用する必要がありますord()

str1_count[ord(str2[i]) - ord('a')]

str1/str2 の命名でそこにバグが入り込んだように見えますが

于 2012-07-02T00:18:35.933 に答える
3

またはさらに良いことに、

def are_anagrams(s1, s2):
    return sorted(s1)==sorted(s2)

.

編集: @gnibblerへの応答:

これは実行時の簡単な比較です。x 軸は文字列の長さです。青はあなたの機能、緑は私の機能です。どちらも私にはかなり直線的に見えます。

関数の実行時間を比較するグラフ

于 2012-07-02T01:18:26.380 に答える