实习生面试--算法题之字符串最长公共子序列长度

题目:求两字符串的最长公共子序列的长度。

 

题外话:最长公共子串,子序列问题是被充分讨论的问题,网上一搜一大把,请bing之。

本题只要求求最长公共子序列的长度,而不需要记录最长的公共子序列,给予了我们便利,请参考代码:

 1 int max(int a, int b)
 2 {
 3     return a > b ? a : b;
 4 }
 5 
 6 int lcs(char* str1, char* str2)
 7 {
 8     if (str1 == nullptr || str2 == nullptr)
 9     {
10         return -1;
11     }
12 
13     if (*str1 == '\0' || *str2 == '\0')
14     {
15         return 0;
16     }
17 
18     if (*str1 == *str2)
19     {
20         return 1 + lcs(str1 + 1, str2 + 1);
21     }
22 
23     return max(lcs(str1 + 1, str2), lcs(str1, str2 + 1));
24 }
View Code

 

其基本思想就是:

LCS(S,T),则有如下情况:

1.S[m] = T[n],那么LCS(Sm,Tn) = LCS(Sm-1,Yn-1) + 1

2.当S[m] != T[n] ,那么LCS(Sm,Tn) 便是  LCS(Sm,Tn-1)和LCS(Sm-1,Tn)中较大者。

 

转载于:https://www.cnblogs.com/joluo/p/4496063.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值