您的位置:首页 > 移动开发 > Objective-C

最长公共子字符串查找(OC实现)

2015-10-12 23:33 751 查看

前言:

使用类别扩展NSString实现。


题目及代码:

main.m

//实现查找两个字符串中最大相同的子串,例如:”likeyou”和”lookyou”,最大相同的子串是”you”。
#import <Foundation/Foundation.h>
#import "NSString+Find.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
char *s1=malloc(30*sizeof(char)),*s2=malloc(30*sizeof(char));
NSLog(@"输入字符串1(长度小于30):");
gets(s1);
NSLog(@"输入字符串2(长度小于30):");
gets(s2);
NSString *str1=[NSString stringWithUTF8String:s1];
NSString *str2=[NSString stringWithUTF8String:s2];
NSLog(@"你输入的两个字符串为:%@,%@",str1,str2);
NSString *subStr=[str1 findMaxSubstring:str1 andString2:str2];
if (subStr) {
NSLog(@"最长公共子串是:%@",subStr);
}
}
return 0;
}


NSString+Find.h

#import <Foundation/Foundation.h>

@interface NSString (Find)
//找到两个字符串的最大公共子字符串
-(NSString*)findMaxSubstring:(NSString *)string1 andString2:(NSString*)string2;
@end


NSString+Find.m

#import "NSString+Find.h"

@implementation NSString (Find)
-(NSString *)findMaxSubstring:(NSString *)string1 andString2:(NSString *)string2{
//    首先找到长度较小的字符串 保证string1<string2
NSString *temp;
if ([string1 length]>[string2 length]) {
temp=string1;
string1=string2;
string2=temp;
}
long length1=[string1 length];
//    然后从长到短获取string1的子字符串,去string2中找,如果包含,则返回该子字符串,否则再找
NSRange range=NSMakeRange(0, length1);
while (![string2 containsString:[string1 substringWithRange:range]]&&range.location<=length1-1&&range.length>=1) {//如果string2不包含目前的子串并且没有越界

//        判断下一步操作
if (range.location<length1-range.length) {//不需要减length
range.location++;
}else{
range.length--;
range.location=0;
}
}
//    最后判断并返回子串
if (range.length==0) {
NSLog(@"没有找到公共子字符串!");
return nil;
}else{
NSLog(@"找到了");
return [string1 substringWithRange:range];
}
}
@end


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  字符串 objective-c