//
// main.m
// 求n个字符串中的最大公共字符串(详解版)
//
// Created by yaomars on 16/4/27.
// Copyright © 2016年 yaomars. All rights reserved.
//
// 求N个字符串的最大公共子字符串(OC)
#import <Foundation/Foundation.h>
//求存储字符串的数组中最大公共子字符串的函数
NSString* containsMaxCommonString(NSArray *array){
NSString *temp = [NSString string];
//定义一个能够被Block捕获的可修改值的变量
__block NSUInteger maxStr = 0;
//定义一个可变的数组用来存储公共字符串
NSMutableArray *stringArray = [NSMutableArray array];
//取出数组中第一个字符串元素进行截取,并与第二个字符串元素作包含关系判断
for (int i=0; i<=[array[0] length]; i++) { //此循环控制对字符串循环的次数
for (int j=0; j<[array[0] length]-i; j++) { //此循环是控制截取的子字符串个数
temp = [array[0] substringWithRange:NSMakeRange(j, i+1)];
if ([array[1] containsString:temp]) {
[stringArray addObject:temp]; //是包含关系的字符串 添加到 可变数组中
}
}
}
if(stringArray.count != 0){
//判断array中剩余的字符串元素与stringArray的包含关系
for (int n=2; n<array.count; n++) {
//判断字符串元素是否包含公共字符串数组stringArray中的字符串元素
for (int k=0; k<[stringArray count]; k++) {
if (![array[n] containsString:stringArray[k]]) {
//特别注意:当移除一个stringArray中的元素时,后面的元素会集体向前移动一位,并且[stringArray count]会减1.
[stringArray removeObjectAtIndex:k];
//此时k--是用来抵消for循环中的k++,让k值不进行变化
k--;
}
}
}
//遍历可变数组stringArray,寻找其中最大的字符串元素,获得其下标值
[stringArray enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if([[stringArray firstObject] length] < [[stringArray objectAtIndex:idx] length]){
maxStr = idx;
}
}];
}else{
return nil;
}
//返回最大的公共字符串
if (stringArray.count != 0) { //上面对stringArray进行了元素的移除操作,故在此要进行重复判断
return [stringArray objectAtIndex:maxStr];
}else{
return nil;
}
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSString *str1 = @"wfrt_heima_kil";
NSString *str2 = @"gkueeimaswd";
NSString *str3 = @"zttmas";
NSString *str4 = @"sshymkkmajju";
//把字符串存入到数组中
NSArray *array = [NSArray arrayWithObjects:str1,str2,str3,str4, nil];
//调用求最大公共子字符的函数
NSString *maxString = containsMaxCommonString(array);
NSLog(@"最大公共字符串是: %@",maxString); //结果为:ma
}
return 0;
}
求n个字符串中的最大公共字符串(详解版)
最新推荐文章于 2021-12-22 13:23:35 发布