好吧,所以我试图比较两个字符串,一个八个字母长,一个可以是3-8个字母长的字符串,看看较短的字符串是否可以用较长的字母组成。根据一些算法和提示,我得到的东西几乎可以工作,但并非在所有情况下都有效。
haystack
和needle
被重新排序为字母顺序(例如,tomatoes
将成为aemoostt
,toe
将变为{{ 1}})。在某些情况下,这有效,但如果存在多个字母,则会出现问题。一个这样一个破碎的例子就是它认为eot
确实存在于aaabrs
内,显然它不应该存在,因为它里面有三个A.
如果有人可以浏览我的方法并发现问题发生的地方,我将非常感激,非常感激。提前谢谢。
aabeirsz
答案 0 :(得分:2)
我建议您进一步转换输入。按字母排序后,构建一个频率表,将每个字符串转换为(字母,频率)映射。然后浏览较短的字符串的映射,对于每个键,如果较大的字符串映射中不存在该键,或者较大的字符串映射中的频率较小,则拒绝为anagram。否则,它会通过。
编辑有一点需要注意,我绝不是Objective C程序员,这里有一个关于如何为NSCountedSet
haystack
建立频率表的问题: / p>
NSCountedSet *haystackSet = [[NSCountedSet alloc] init];
NSUInteger len = [haystack length];
for (NSUInteger i = 0; i < len; i++) {
unichar c = [haystack characterAtIndex:i];
if ([[NSCharacterSet letterCharacterSet] characterIsMember:c])
[haystackSet addObject:[NSNumber numberWithInteger:c]];
}
对needle
执行相同操作,然后重复needle
的计数并检查haystack
的计数。
答案 1 :(得分:0)
问题是从needle
搜索字符始终会搜索整个haystack
。 newHaystack
作为haystack
的新子字符串正确创建,但实际上从未使用过。因此,例如,搜索每个字符a
始终会搜索整个原始值aabeirsz
。