字谜/部分字谜检测算法找到不正确的答案

Posted

技术标签:

【中文标题】字谜/部分字谜检测算法找到不正确的答案【英文标题】:Anagram / partial anagram detection algorithm finds incorrect answers 【发布时间】:2012-11-07 21:08:00 【问题描述】:

我编写了以下方法来确定一个长单词是否包含一个较短的单词,以及我传递字母的顺序似乎会影响结果。

我注意到,如果我喂它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;

【问题讨论】:

【参考方案1】:

你的算法的问题是这条线不起作用:

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;

【讨论】:

【参考方案2】:
 - (BOOL) does: (NSString* ) longWord contain: (NSString *) shortWord 
 
      return ([longWord rangeOfString:shortWord].location != NSNotFound);   
 

【讨论】:

这不起作用。对上述两个示例返回 no,按字母顺序排列和未按字母顺序排列。 例如,在tower(或eorwt)中,由于r的位置,此代码将找不到two(或otw)。

以上是关于字谜/部分字谜检测算法找到不正确的答案的主要内容,如果未能解决你的问题,请参考以下文章

查找最长字谜的算法

字谜字符串编辑距离算法/代码?

查找单词字谜数量的算法?

hackerrank“制作字谜”挑战超时失败

如何找出字符串的两个相等部分是不是是python中的字谜

Java anagram finder 算法