字谜/部分字谜检测算法找到不正确的答案
Posted
技术标签:
【中文标题】字谜/部分字谜检测算法找到不正确的答案【英文标题】:Anagram / partial anagram detection algorithm finds incorrect answers 【发布时间】:2012-11-07 21:08:00 【问题描述】:我编写了以下方法来确定一个长单词是否包含一个较短的单词,以及我传递字母的顺序似乎会影响结果。
我注意到,如果我喂它absconds
和bassy
,它会正确报告NO
,但是如果我按字母顺序给它abcdnoss
和abssy
,它会给出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
)。以上是关于字谜/部分字谜检测算法找到不正确的答案的主要内容,如果未能解决你的问题,请参考以下文章