Objective-C实现最长回文子序列算法(附完整源码)
发布日期:2025-04-26 04:33:34 浏览次数:3 分类:精选文章

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

Objective-C实现最长回文子序列算法

在 Objective-C 中实现最长回文子序列(Longest Palindromic Subsequence,LPS)算法可以使用动态规划的方法。以下是一个完整的实现代码示例,以及详细的代码解释。

代码实现

#import 
@interface Solution : NSObject(NSInteger)longestPalindromicSubsequence:(NSString *)s;
@end
@implementation Solution
- (NSInteger)longestPalindromicSubsequence:(NSString *)s {
if (s == nil || s.length == 0) {
return 0;
}
// 定义动态规划表格,dp[i][j]表示子序列s[0..i-1]和s[j..n-1]的最长回文子序列长度
int n = s.length;
int **dp = (int **)malloc(n * n);
for (int i = 0; i < n; i++) {
dp[i][i] = 1; // 单个字符的最长回文子序列长度为1
}
// 遍历所有可能的子序列起始和结束位置
for (int i = 0; i < n; i++) {
for (int j = i; j < n; j++) {
if (s[i] == s[j]) {
if (i == j) {
dp[i][j] = 1;
} else {
dp[i][j] = dp[i+1][j-1] + 2;
}
} else {
dp[i][j] = max(dp[i+1][j], dp[i][j-1]);
}
}
}
return dp[0][n-1];
}
@end

代码解释

  • 初始化动态规划表格:我们创建一个二维数组 dp,其中 dp[i][j] 表示子序列 s[0..i-1]s[j..n-1] 的最长回文子序列长度。

  • 处理单个字符的情况:当 i == j 时,单个字符的最长回文子序列长度为 1。

  • 填充动态规划表格:遍历所有可能的子序列起始和结束位置 ij。如果 s[i] 等于 s[j],则 dp[i][j] 等于 dp[i+1][j-1] + 2(当前字符加上中间部分的最长回文子序列长度)。如果 s[i] 不等于 s[j],则 dp[i][j]dp[i+1][j]dp[i][j-1] 中的最大值。

  • 返回结果:最终的 dp[0][n-1] 即为字符串 s 的最长回文子序列长度。

  • 总结

    通过动态规划的方法,我们可以高效地解决最长回文子序列问题。该算法的时间复杂度为 O(n^2),适用于处理较短的字符串。对于更长的字符串,可以考虑使用更高效的算法如Manacher算法或中心扩展法。

    上一篇:Objective-C实现最长子数组算法(附完整源码)
    下一篇:Objective-C实现最长回文子串算法(附完整源码)

    发表评论

    最新留言

    关注你微信了!
    [***.104.42.241]2025年04月21日 12时06分03秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章