这是我想要做的。我有2个字符串,我想确定一个字符串是否是另一个字符串的置换。我正在考虑只是从字符串B中删除字符串A中的字符,以确定是否还有字符。如果否,那么它通过。只从字符列表中移除一个字符的第一个实例
但是,除非单词中有多个字母,否则我需要确保每个字母只有一个实例被删除(并非全部出现)。
一个例子:
String一个:斜面
字符串B:连接
结果:-o-nec-
用的NSString和NSScanner进行实验已经产生了不迄今为止的结果。
这是我想要做的。我有2个字符串,我想确定一个字符串是否是另一个字符串的置换。我正在考虑只是从字符串B中删除字符串A中的字符,以确定是否还有字符。如果否,那么它通过。只从字符列表中移除一个字符的第一个实例
但是,除非单词中有多个字母,否则我需要确保每个字母只有一个实例被删除(并非全部出现)。
一个例子:
String一个:斜面
字符串B:连接
结果:-o-nec-
用的NSString和NSScanner进行实验已经产生了不迄今为止的结果。
这将返回你的例子询问...
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不在字符串b中,所以我会说,不能不是连接的置换。根据这个定义,我会用这样的:
-(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;
}
嗯,让我们一展身手:
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);
对不起,刚才看到stringA和stringB和结果,没有充分阅读的问题;) – dreamlax 2010-05-29 07:59:55
低效而又简单的方法可能是这样的(这是实现为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
此解决方案假定这两个词是相同的长度,这将无法正常工作在这种情况下。我需要能够检查更大的单词的子集。对不起,如果我不清楚:( – Luke 2010-05-29 16:18:32
@Luke:你可以很容易地删除长度位,并使用两个字符串中较大的字符串作为长度。从你的问题,我想你想检查一个字符串是否是另一个字符串,如果字符串的长度不同,这将是错误的 – 2010-05-30 03:02:40
是的,这是我的糟糕,对混淆抱歉,我的意思不是单词的一个子集或排列,这意味着在字B中的字母,我可以在不重复的情况下做出答案,下次试图更加清晰,谢谢你的帮助! – Luke 2010-06-02 02:58:33
真的,我想我正在寻找的是一个更大的字符集的派生或子集。回答正确,因为它提供了这两种功能。 我还测试了所有提供的代码示例,它们工作正常。 作为一个方面说明,我有工作代码检查char值并移动了内存块,但仍然发现内存不足,即使它看起来没有泄漏。 解决方案或问题是我如何设置NSAutoreleasePool。因此,如果任何人在批量操作中使用此代码,可能检查:) 感谢大家! – Luke 2010-05-30 02:46:17