【问题标题】: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;
}

【问题讨论】:

    标签: objective-c while-loop anagram


    【解决方案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)。
      猜你喜欢
      • 2016-05-21
      • 2011-11-03
      • 2011-01-17
      • 2018-12-15
      • 2010-12-01
      • 2012-11-03
      • 2019-02-02
      • 2013-01-11
      • 2021-04-21
      相关资源
      最近更新 更多