1

私はアナグラムをチェックするために次のコードを書きました.

-(BOOL) findAnagram :(NSString *) string1 :(NSString *) string2
{
    int len = string1.length;
    if (len != string2.length)
    {
        return false;
    }

    for (int i=0; i < len; i++)
    {
        int h = 0;
        int q = 0;
        for (int k = 0;  k < len ; k ++)
        {
            if ([string1 characterAtIndex:i] == [string1 characterAtIndex:k])
            {
                h++;
            }
            if ([string1 characterAtIndex:i] == [string2 characterAtIndex:k])
            {
                q++;
            }
        }

        if (h!=q)
        {
            return false;
        }
    }
    return TRUE;
}
4

6 に答える 6

23

O(n ^ 2)アルゴリズムである、あなたのバージョンよりもパフォーマンスの高いバージョンは、O(n)アルゴリズムです。

BOOL anagrams(NSString *a, NSString *b)
{
    if (a.length != b.length)
        return NO;

    NSCountedSet *aSet = [[NSCountedSet alloc] init];
    NSCountedSet *bSet = [[NSCountedSet alloc] init];

    for (int i = 0; i < a.length; i++)
    {
        [aSet addObject:@([a characterAtIndex:i])];
        [bSet addObject:@([b characterAtIndex:i])];
    }

    return [aSet isEqual:bSet];
}
于 2012-12-16T21:58:23.310 に答える
1

それは私にはうまく見えます。しかし、コードスタイルは少し奇妙です。私はそれをこのように書くでしょう:

- (BOOL)isStringAnagram:(NSString *)string1 ofString:(NSString *)string2 {
    int len = string1.length;
    if (len != string2.length) {
        return NO;
    }

    for (int i=0; i < len; i++) {
        int h = 0;
        int q = 0;
        for (int k = 0;  k < len; k++) {
            if ([string1 characterAtIndex:i] == [string1 characterAtIndex:k]) {
                h++;
            }
            if ([string1 characterAtIndex:i] == [string2 characterAtIndex:k]) {
                q++;
            }
        }

        if (h != q) {
            return NO;
        }
    }

    return YES;
}

私が抱えている主な問題は、メソッド名です。名前の前に何もないパラメーターを含めることは可能ですが、お勧めできません。つまりfindAnagram::、私が使用したのに対し、あなたは名前として持っていましたisStringAnagram:ofString:

于 2012-12-16T21:49:44.407 に答える
1

2 つの文字列にまったく同じ文字が含まれているかどうかを知りたいですか? 最も簡単な方法は、おそらく両方を並べ替えて、並べ替えられたバージョンを比較することです。

もう 1 つの方法は、各文字の出現回数 (A の数、B の数など) を数え、それらの数を比較することです。

(注: 2 番目の方法は最初の方法のバリエーションにすぎません。文字列を並べ替える効率的な方法の 1 つです)

于 2012-12-16T21:48:56.473 に答える