逐字符循环两个字符串以找到部分字谜

时间:2012-11-14 16:21:37

标签: objective-c algorithm for-loop nsstring

好吧,所以我试图比较两个字符串,一个八个字母长,一个可以是3-8个字母长的字符串,看看较短的字符串是否可以用较长的字母组成。根据一些算法和提示,我得到的东西几乎可以工作,但并非在所有情况下都有效。

haystackneedle被重新排序为字母顺序(例如,tomatoes将成为aemoostttoe将变为{{ 1}})。在某些情况下,这有效,但如果存在多个字母,则会出现问题。一个这样一个破碎的例子就是它认为eot确实存在于aaabrs内,显然它不应该存在,因为它里面有三个A.

如果有人可以浏览我的方法并发现问题发生的地方,我将非常感激,非常感激。提前谢谢。

aabeirsz

2 个答案:

答案 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搜索字符始终会搜索整个haystacknewHaystack作为haystack的新子字符串正确创建,但实际上从未使用过。因此,例如,搜索每个字符a始终会搜索整个原始值aabeirsz