最長公共子字符串查找(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

運行結果:

這裏寫圖片描述

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