计算两个字符串的最大字符串匹配,对极端以及错误情况不作处理
首先选定一个字符串作为目标字符串,获取这个目标字符串的所有字符子集
比如 targetString = "abcd"
,可以得到的字符子集为[abcd] 或 [abc,bcd] 或 [ab,bc,cd] 或 [a,b,c,d]
:
子集长度为1时 | 子集长度为2时 | 子集长度为3时 | 子集长度为4时(最大字符串) |
---|---|---|---|
a,b,c,d | ab,bc,cd | abc,bcd | abcd |
因此可以传入不同的子集长度,来获取到所有的子集。抽象出的函数如下:
- (NSArray *)arrOfSubString:(NSString *)targetString index:(NSUInteger)length {
if (length > targetString.length) return nil;
NSMutableArray *arrSubString = [NSMutableArray new];
for (int i = 0; i <= targetString.length-length; i ++) {
NSString * subString = [targetString substringWithRange:NSMakeRange(i, length)];
[arrSubString addObject:subString];
}
return arrSubString;
}
为了获取到所有的字符子集,需要遍历 targetString
,targetString
的每个字符的 index 作为上面函数的 length 参数。每一个循环会获取到一个子集,然后该子集再和第二个字符串做匹配,看第二个字符串是否包含该子集里的任意一个字符串。接下来抽象出最后的匹配函数如下:
// 最大字符匹配
- (void)matchMaxLengthString:(NSString *)firstString sendString:(NSString *)targetString {
BOOL isMatched = NO;
NSString *resultString = @"";
//获取最大字符,所以从最大的 index 开始遍历
for (NSInteger i = targetString.length; i > 0; i--) {
// 获取字符子集
NSArray *arrString = [self arrOfSubString:targetString index:i];
for (int j = 0 ; j < arrString.count; j ++) {
// 用子集中的每一个元素与另外一个字符串进行匹配
if ([firstString rangeOfString:arrString[j]].location != NSNotFound) {
isMatched = YES;
resultString = arrString[j];
break;
}
}
if (isMatched) {
break;
}
}
NSLog(@"result == %@",resultString);
}