2012-11-19 48 views
0

我已经编写了下列方法来确定一个长单词是否包含较短的单词,并且我传递这些字母的顺序似乎影响结果。Anagram/partial anagram检测算法找到不正确的答案

我发现,如果我给它abscondsbassy它正确报道NO,但如果我按字母顺序排列的字母,并给它abcdnossabssy,它给YES。我不太确定这是为什么 - 任何人都可以发现问题?

- (BOOL) does: (NSString*) longWord contain: (NSString *) shortWord { 
    while([longWord length] > 0 && [shortWord length] > 0) { 
     NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString: [shortWord substringToIndex: 1]]; 
     if ([longWord rangeOfCharacterFromSet: set].location == NSNotFound) { 
      return NO; 
     } 
     longWord = [longWord substringFromIndex: [longWord rangeOfCharacterFromSet: set].location+1]; 
     shortWord = [shortWord substringFromIndex: 1]; 
    } 
    return YES; 
} 

回答

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; 
} 
0
- (BOOL) does: (NSString*) longWord contain: (NSString *) shortWord 
{ 
     return ([longWord rangeOfString:shortWord].location != NSNotFound); 
} 
+0

这不起作用。上述两个例子均返回no,按字母顺序排列且未按字母顺序排列。 – Luke

+0

例如,在'tower'(或'eorwt')中,由于'r'的位置,此代码不会找到'two'(或'otw')。 – Luke