以下是一个使用Objective-C编写的最长公共子序列(LCS)算法的完整实现代码。该算法基于动态规划原理,能够有效地计算两个字符串的最长公共子序列。
#import
@interface LCS : NSObject
(NSString *)longestCommonSubsequenceBetween:(NSString *)string1:(NSString *)string2;
本文共 1574 字,大约阅读时间需要 5 分钟。
以下是一个使用Objective-C编写的最长公共子序列(LCS)算法的完整实现代码。该算法基于动态规划原理,能够有效地计算两个字符串的最长公共子序列。
#import
@interface LCS : NSObject
(NSString *)longestCommonSubsequenceBetween:(NSString *)string1:(NSString *)string2;
@implementation LCS (NSString *)longestCommonSubsequenceBetween:(NSString *)string1:(NSString *)string2{// 初始化一个二维数组来保存中间结果int **dp = [[int alloc] init]; // 计算字符串的长度NSInteger len1 = [string1 length];NSInteger len2 = [string2 length]; // 初始化dp数组,dp[i][j]表示第i个字符和第j个字符的最长公共子序列长度for (NSInteger i = 0; i <= len1; i++) {for (NSInteger j = 0; j <= len2; j++) {if (i == 0 || j == 0) {dp[i][j] = 0;} else if (string1[i-1] == string2[j-1]) {dp[i][j] = dp[i-1][j-1] + 1;} else {dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}} // 由于Objective-C不能直接将整数数组转换为NSString,我们需要将二维数组转换为一个线性数组// 并将路径恢复出来return [self getLCSFromDP:dp len1: len1 len2: len2];} (NSString *)getLCSFromDP:(int **)dplen1:(NSInteger)len1len2:(NSInteger)len2{NSInteger i = len1;NSInteger j = len2; // 从dp数组中找出路径并构建最长公共子序列while (i > 0 && j > 0) {if (dp[i][j] == dp[i-1][j-1] + 1) {// 当前字符匹配,加入结果result += [string1 characterAt(i-1)];i--;j--;} else if (dp[i][j] == dp[i-1][j]) {// 上移i--;} else {// 左移j--;}} return result;} @end 该实现采用动态规划算法来解决最长公共子序列问题。通过创建一个二维数组来保存中间计算结果,逐步比较两个字符串中的字符,最终找出最长公共子序列。该算法的时间复杂度为O(n*m),其中n和m分别是两个字符串的长度。
示例使用:
LCS *lcs = [[LCS alloc] init]; NSString *result = [lcs longestCommonSubsequenceBetween:@"abcde" :@"ace"]; NSLog(@"最长公共子序列为:%@", result);
转载地址:http://wlnfk.baihongyu.com/