给一个字符串说“acbXyzKlm”我想把它分成abc,Xyz,Klm。一种天真的方法是遍历字符串并检测案例更改以进行拆分。我想知道是否有更好的算法。
答案 0 :(得分:5)
要确定字符串中的某个点是否为有效断点,您需要读取断点附近的两个字符。因此,任何解决此问题的算法都需要分析每个角色的情况。
你的算法就是这样做的,因此它在计算上是最优的。任何“更好”的算法都将是一种变体和/或微观优化,具有相同的整体复杂性。
答案 1 :(得分:0)
我今天需要这个,所以我用类别实现了它:
@interface NSString (Extensions)
- (NSString*) spacify;
@end
@implementation NSString (Extensions)
- (NSString*) spacify
{
// ignore irrelevant strings
if (self.length < 1)
return self;
NSMutableString* result = [NSMutableString stringWithString:self];
// create a range starting after the first character
NSRange range;
range.location = 1;
range.length = [self length] - 1;
// match any uppercase character
NSRegularExpression* r = [NSRegularExpression regularExpressionWithPattern: @"[A-Z]"
options: 0
error: nil];
// replace matches with the match preceded by a space
[r replaceMatchesInString: result
options: 0
range: range
withTemplate: @" $0"];
return [NSString stringWithString:result];
}
@end
试验:
@implementation NSStringExtensionsTest
- (void) testSpacify
{
NSString* target = @"ThisIsAStringX";
NSString* expected = @"This Is A String X";
NSString* actual = [target spacify];
STAssertEqualObjects(expected, actual, nil);
}
- (void) testSpacify_NoMatches_DoesNothing
{
NSString* target = @"thisisstring";
NSString* actual = [target spacify];
STAssertEqualObjects(target, actual, nil);
}
- (void) testSpacify_EmptyString_DoesNothing
{
NSString* target = @"";
NSString* actual = [target spacify];
STAssertEqualObjects(target, actual, nil);
}
- (void) testSpacify_InvalidLength_DoesNothing
{
NSString* target = @"A";
NSString* actual = [target spacify];
STAssertEqualObjects(target, actual, nil);
}
@end