1

query〜10文字を含むNSStringという名前があります。

word呼び出された 2 番目の NSStringに のすべての文字が含まれているqueryか、または一部の文字が含まれているが、で指定されていない他の文字が含まれていないかを確認したいと思いますquery

また、クエリ内でその文字が 1 回しか出現しない場合は、単語内でその文字が 1 回だけ出現する可能性があります。

これを行う方法を教えてください。

NSString *query = @"ABCDEFJAKSUSHFKLAFIE";
NSString *word  = @"fearing"; //would pass as NO as there is no 'n' in the query var.  
4

1 に答える 1

5

以下は前半の答えです。

NSCharacterSet *nonQueryChars = [[NSCharacterSet characterSetWithCharactersInString:[query lowercaseString]] invertedSet];
NSRange badCharRange = [[word lowercaseString] rangeOfCharacterFromSet:nonQueryChars];
if (badCharRange.location == NSNotFound) {
    // word only has characters in query
} else {
    // found unwanted characters in word
}

要件の後半について考える必要があります。

OK、次のコードは両方の要件を満たす必要があります。

- (NSCountedSet *)wordLetters:(NSString *)text {
    NSCountedSet *res = [NSCountedSet set];

    for (NSUInteger i = 0; i < text.length; i++) {
        [res addObject:[text substringWithRange:NSMakeRange(i, 1)]];
    }

    return res;
}

- (void)checkWordAgainstQuery {
    NSString *query = @"ABCDEFJAKSUSHFKLAFIE";
    NSString *word  = @"fearing";

    NSCountedSet *queryLetters = [self wordLetters:[query lowercaseString]];
    NSCountedSet *wordLetters = [self wordLetters:[word lowercaseString]];
    BOOL ok = YES;
    for (NSString *wordLetter in wordLetters) {
        int wordCount = [wordLetters countForObject:wordLetter];
        // queryCount will be 0 if this word letter isn't in query
        int queryCount = [queryLetters countForObject:wordLetter];
        if (wordCount > queryCount) {
           ok = NO;
           break;
        }
    }

    if (ok) {
        // word matches against query
    } else {
        // word has extra letter or too many of a matching letter
    }
}
于 2012-10-29T03:02:10.403 に答える