Удалить только первый экземпляр символа из списка символов - PullRequest
2 голосов
/ 29 мая 2010

Вот что я хочу сделать. У меня есть 2 строки, и я хочу определить, является ли одна строка перестановкой другой. Я думал просто удалить символы из строки A из строки B, чтобы определить, остались ли какие-либо символы. Если нет, то это проходит.

Однако мне нужно убедиться, что удаляется только 1 экземпляр каждой буквы (не все вхождения), если в слове нет нескольких букв.

Пример:

Строка A: не может

Строка B: подключить

Результат: -o-nec-

Эксперименты с NSString и NSScanner пока не дали никаких результатов.

Ответы [ 3 ]

0 голосов
/ 29 мая 2010

Неэффективный, но простой способ может быть примерно таким (это реализовано как категория на 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
0 голосов
/ 30 мая 2010

Это возвращает то, что просит ваш пример ...

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". В вашем примере, поскольку буква a в буквы cant отсутствует в строке 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;
}
0 голосов
/ 29 мая 2010

Хммм, поехали:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...