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

前言:

使用类别扩展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

运行结果:

这里写图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章