Anagram / partial anagram检测算法找到错误的答案

时间:2012-11-19 21:14:53

标签: objective-c while-loop anagram

我写了下面的方法来确定一个长词是否包含一个较短的单词,并且我传递这些单词的顺序似乎会影响结果。

我注意到,如果我将其abscondsbassy提供给它,则会正确报告NO,但如果我按字母顺序排列并给它abcdnoss和{{1}它给出了abssy。我不太清楚为什么会这样 - 有人能发现这个问题吗?

YES

2 个答案:

答案 0 :(得分:0)

 - (BOOL) does: (NSString* ) longWord contain: (NSString *) shortWord 
 {
      return ([longWord rangeOfString:shortWord].location != NSNotFound);   
 }

答案 1 :(得分:0)

您的算法存在的问题是此行不起作用:

longWord = [longWord substringFromIndex: [longWord rangeOfCharacterFromSet: set].location+1];

如果您搜索的第一个字母位于长词的末尾,则长词将变为空字符串,并且您将跳出循环为YES。

我会使用不同的算法,就像这样。我认为更容易看到发生了什么,因此不容易出错:

- (BOOL) does: (NSString* ) longWord contain: (NSString *) shortWord {
    NSMutableString *longer = [longWord mutableCopy];
    for (int i = 0; i<shortWord.length; i++) {
        NSString *letter = [shortWord substringWithRange:NSMakeRange(i, 1)];
        NSRange letterRange = [longer rangeOfString:letter];
        if (letterRange.location != NSNotFound) {
            [longer deleteCharactersInRange:letterRange];
        }else{
            return NO;
        }
    }
    return YES;
}