2016-12-03 10 views
0

問題が発生しているので、この関数の動作を理解できません。どんな助けでも大歓迎です。主に私は '0'でASCIIを使用している理由とasciiにキャストした後に増分と減分が達成していることについて混乱しています。順列を検索するASCII変換

bool isPermutation(string str1, string str2) 
{ 
    if(str1.size() != str2.size()) 
     return false; 

    int i, j, counts[10]; 

    for(i = 0; i < 10;i++) 
     counts[i] = 0; 

    for(i = 0; i < str1.size(); i++) 
     counts[str1[i] - '0']++; // (1) 

    for(i = 0; i < str1.size(); i++) 
     counts[str2[i] - '0']--; // (2) 

    for(i = 0; i < 10; i++) // (3) 
     if(counts[i] != 0) // (4) 
      return true; // (5) Should be return false; 

    return false; // (6) Should be return true; 
} 
+0

0はゼロですが、 ''0 '== 48'です。ここを見て:http://www.asciitable.com/ – Tobias

+0

私は理解していません。それはあなたが不思議に思っている機能ですか?上記のコード、実際のコード、またはコメントとして考えられるものは何ですか? – Tobias

答えて

0

あなたが投稿したコードは間違っています。最も重大なエラーは、私のコメントで述べたように配列countsが小さすぎるということです。私は次のようにプログラムを少し更新してみましょう:

bool isPermutation(std::string a, std::string b) { 
    char counts[256] = {0}; // initializes all elements to zero. 

    if (a.size() != b.size()) 
     return false; 

    for (int i; i < a.size(); ++i) 
     counts[a[i]]++; 

    for (int i; i < b.size(); ++i) 
     counts[b[i]]--; 

    for (int i; i < sizeof(counts)/sizeof(counts[0]); ++i) 
     if (counts[i] != 0) 
      return false; 

    return true; 
} 

全体的なアイデアはaの各文字のインスタンスの数を数えることです。最初のfor -loopが終了すると、counts[i]には各文字(インデックス、ASCII値)のインスタンス数(値)が含まれます。

次に、2番目のfor -loopで減分します。これらのうち一致しないもの、つまりcountsのすべてがゼロでない場合、それは順列にすることはできません。