博客
关于我
Objective-C实现shortestCommonSupersequence最短公共超序列算法(附完整源码)
阅读量:793 次
发布时间:2023-02-19

本文共 2066 字,大约阅读时间需要 6 分钟。

最短公共超序列(SCS)问题是一个经典的动态规划问题。给定两个字符串,目标是找到一个最短的字符串,该字符串包含这两个字符串作为子序列。

动态规划方法实现

为了解决这个问题,我们可以使用动态规划的方法。以下是实现步骤:

  • 初始化动态规划表:创建一个二维数组dp,其中dp[i][j]表示处理第一个字符串的前i个字符和第二个字符串的前j个字符时的最短超序列长度。

  • 填充动态规划表

    • 当第一个字符和第二个字符相等时,dp[i][j] = dp[i-1][j-1] + 1。
    • 当两个字符不相等时,dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + 1。
  • 处理边界条件

    • 如果i=0或j=0,dp[i][j] = 0,因为一个空字符串与任何字符串的最短超序列长度都是0。
  • 构建结果字符串:根据dp表,从右下角开始反推出最短超序列。

  • 代码实现

    #import 
    @interface SCS : NSObject{ NSString *str1; NSString *str2;}@property (nonatomic, retain) NSString *str1;@property (nonatomic, retain) NSString *str2;- (NSString *)shortestCommonSupersequence;@end@implementation SCS- (NSString *)shortestCommonSupersequence{ NSString *s1 = self.str1; NSString *s2 = self.str2; int m = s1.length; int n = s2.length; // 创建动态规划表 int dp[m+1][n+1]; // 初始化第一行和第一列 for (int i = 0; i <= m; i++) { dp[i][0] = 0; } for (int j = 0; j <= n; j++) { dp[0][j] = 0; } // 填充dp表 for (int i = 1; i <= m; i++) { for (int j = 1; j <= n; j++) { if (s1[i-1] == s2[j-1]) { dp[i][j] = dp[i-1][j-1] + 1; } else { dp[i][j] = min(dp[i][j-1], dp[i-1][j]) + 1; } } } // 从dp表中构建结果字符串 int i = m, j = n; int k = dp[m][n]; char result[k+1]; memset(result, 0, sizeof(result)); int len1 = 0; int len2 = 0; while (k > 0) { if (s1[i-1] == s2[j-1]) { result[--k] = s1[i-1]; i--; j--; k--; } else { if (dp[i][j-1] > dp[i-1][j]) { result[--k] = s1[i-1]; i--; k--; } else { result[--k] = s2[j-1]; j--; k--; } } } return [NSString stringWithCString(result)UsingEncoding:NSUTF8StringEncoding];}@end

    解释

    • 动态规划表的初始化:我们创建了一个(m+1) x (n+1)的二维数组dp,用于存储各个子序列组合的最短长度。
    • 填充dp表:遍历每个字符的位置,使用递推关系式填充dp表。相等字符时,取前左上角的值加1;不相等字符时,取左或上邻的最小值加1。
    • 结果构建:从dp表的右下角开始,向回推导出最短超序列的字符,选择最优路径。

    通过这种方法,我们可以有效地找到两个字符串的最短公共超序列。

    转载地址:http://ywifk.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现kth order statistick阶统计量算法(附完整源码)
    查看>>
    Objective-C实现lamberts ellipsoidal distance朗伯椭球距离算法(附完整源码)
    查看>>
    Objective-C实现largest AdjacentNumber最大相邻数算法 (附完整源码)
    查看>>
    Objective-C实现largest subarray sum最大子数组和算法(附完整源码)
    查看>>
    Objective-C实现largestPrime最大素数的算法 (附完整源码)
    查看>>
    Objective-C实现lazy segment tree惰性段树算法(附完整源码)
    查看>>
    Objective-C实现LBP特征提取(附完整源码)
    查看>>
    Objective-C实现LDPC码(附完整源码)
    查看>>
    Objective-C实现least common multiple最小公倍数算法(附完整源码)
    查看>>
    Objective-C实现Lempel-Ziv压缩算法(附完整源码)
    查看>>
    Objective-C实现Length conversion长度转换算法(附完整源码)
    查看>>
    Objective-C实现Levenshtein 距离算法(附完整源码)
    查看>>
    Objective-C实现levenshteinDistance字符串编辑距离算法(附完整源码)
    查看>>
    Objective-C实现lfu cache缓存算法(附完整源码)
    查看>>
    Objective-C实现LFU缓存算法(附完整源码)
    查看>>
    Objective-C实现linear congruential generator线性同余发生器算法(附完整源码)
    查看>>
    Objective-C实现linear search线性搜索算法(附完整源码)
    查看>>
    Objective-C实现LinkedListNode链表节点类算法(附完整源码)
    查看>>
    Objective-C实现LinkedList链表算法(附完整源码)
    查看>>
    Objective-C实现logistic regression逻辑回归算法(附完整源码)
    查看>>