检查NSString是否包含全部或部分字符

1 comparison predicate objective-c nsstring ios

我有一个NSString query,其中包含~10个字符.

我想检查一下,调用的第二个NSString是否word包含所有字符query或某些字符,但没有其他未指定的字符query.

此外,如果查询中只出现一个字符,则该字中只能出现一个字符.

请问你能告诉我怎么做吗?

NSString *query = @"ABCDEFJAKSUSHFKLAFIE";
NSString *word  = @"fearing"; //would pass as NO as there is no 'n' in the query var.  
Run Code Online (Sandbox Code Playgroud)

rma*_*ddy 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
}
Run Code Online (Sandbox Code Playgroud)

我需要考虑下半部分的要求.

好的,以下代码应满足这两个要求:

- (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
    }
}
Run Code Online (Sandbox Code Playgroud)