仅从字符列表中删除字符的第一个实例

时间:2010-05-29 07:29:05

标签: objective-c cocoa macos

这就是我想要做的。我有2个字符串,我想确定一个字符串是否是另一个字符串的排列。我想只是从字符串B中删除字符串A中的字符,以确定是否还有任何字符。如果不是,则通过。

但是,除非单词中有多个字母,否则我需要确保每个字母只删除一个实例(并非所有出现)。

一个例子:

  

字符串A:不能

     

字符串B:连接

     

结果:-o-nec -

到目前为止,尝试使用NSString和NSScanner没有产生任何结果。

3 个答案:

答案 0 :(得分:0)

嗯,让我们去吧:

NSString *stringA = @"cant";
NSString *stringB = @"connect";

NSUInteger length = [stringB length];
NSMutableCharacterSet *charsToRemove = [NSMutableCharacterSet characterSetWithCharactersInString:stringA];

unichar *buffer = calloc(length, sizeof(unichar));
[stringB getCharacters:buffer range:NSMakeRange(0, length)];

for (NSUInteger i = 0; i < length; i++)
{
    if ([charsToRemove characterIsMember:buffer[i]])
    {
        [charsToRemove removeCharactersInRange:NSMakeRange(buffer[i], 1)];
        buffer[i] = '-';
    }
}

NSString *result = [NSString stringWithCharacters:buffer length:length];

free (buffer);

答案 1 :(得分:0)

一种低效但简单的方法可能是这样的(这是作为NSString上的类别实现的,但它可以很容易地成为一个带有两个字符串的方法或函数):

@implementation NSString(permutation)
- (BOOL)isPermutation:(NSString*)other
{
    if( [self length] != [other length] ) return NO;
    if( [self isEqualToString:other] )    return YES;
    NSUInteger length = [self length];
    NSCountedSet* set1 = [[[NSCountedSet alloc] initWithCapacity:length] autorelease];
    NSCountedSet* set2 = [[[NSCountedSet alloc] initWithCapacity:length] autorelease];
    for( int i = 0; i < length; i++ ) {
        NSRange range = NSMakeRange(i, 1);
        [set1 addObject:[self substringWithRange:range]];
        [set2 addObject:[self substringWithRange:range]];
    }
    return [set1 isEqualTo:set2];
}
@end

答案 2 :(得分:-1)

这将返回您的示例要求的内容......

NSString* a = @"cant";
    NSString* b = @"connect";

    NSMutableString* mb = [NSMutableString stringWithString:b];
    NSUInteger i;
    for (i=0; i<[a length]; i++) {
        NSString* theLetter = [a substringWithRange:NSMakeRange(i, 1)];
        NSRange r = [mb rangeOfString:theLetter];
        if (r.location != NSNotFound) {
            [mb replaceCharactersInRange:r withString:@"-"];
        }
    }
    NSLog(@"mb: %@", mb);

但是,我不会称之为排列。对我来说,只有字符串“a”中的所有字符都包含在字符串“b”中时,排列才会成立。在你的例子中,因为cant中的字母a不在字符串b中,所以我会说cant不是连接的排列。有了这个定义,我会用这个:

-(BOOL)isString:(NSString*)firstString aPermutationOfString:(NSString*)secondString {
    BOOL isPermutation = YES;
    NSMutableString* mb = [NSMutableString stringWithString:secondString];
    NSUInteger i;
    for (i=0; i<[firstString length]; i++) {
        NSString* theLetter = [firstString substringWithRange:NSMakeRange(i, 1)];
        NSRange r = [mb rangeOfString:theLetter];
        if (r.location != NSNotFound) {
            [mb deleteCharactersInRange:r];
        } else {
            return NO;
        }

    }
    return isPermutation;
}