網站首頁 編程語言 正文
最長公共子序列
最長公共子序列(LCS)是一個在一個序列集合中(通常為兩個序列)用來查找所有序列中最長子序列的問題。一個數列 ,如果分別是兩個或多個已知數列的子序列,且是所有符合此條件序列中最長的,則稱為已知序列的最長公共子序列。
動態規劃:
采用二維數組flag來記錄下標i和j的走向。數字"1"表示,斜向下;數字"2"表示,水平向右;數字"3"表示,豎直向下
問題描述: 設有字符串a[0…n],b[0…m],下面就是遞推公式。字符串a對應的是二維數組num的行,字符串b對應的是二維數組num的列。
代碼實現
#include<stdio.h>
#include<string.h>
char a[500],b[500];
char num[501][501]; ///記錄中間結果的數組
char flag[501][501]; ///標記數組,用于標識下標的走向,構造出公共子序列
void LCS(); ///動態規劃求解
void getLCS(); ///采用倒推方式求最長公共子序列
int main()
{
int i;
strcpy(a,"ABCBDAB");
strcpy(b,"BDCABA");
memset(num,0,sizeof(num));
memset(flag,0,sizeof(flag));
LCS();
printf("%d\n",num[strlen(a)][strlen(b)]);
getLCS();
return 0;
}
void LCS()
{
int i,j;
for(i=1;i<=strlen(a);i++)
{
for(j=1;j<=strlen(b);j++)
{
if(a[i-1]==b[j-1]) ///注意這里的下標是i-1與j-1
{
num[i][j]=num[i-1][j-1]+1;
flag[i][j]=1; ///斜向下標記
}
else if(num[i][j-1]>num[i-1][j])
{
num[i][j]=num[i][j-1];
flag[i][j]=2; ///向右標記
}
else
{
num[i][j]=num[i-1][j];
flag[i][j]=3; ///向下標記
}
}
}
}
void getLCS()
{
char res[500];
int i=strlen(a);
int j=strlen(b);
int k=0; ///用于保存結果的數組標志位
while(i>0 && j>0)
{
if(flag[i][j]==1) ///如果是斜向下標記
{
res[k]=a[i-1];
k++;
i--;
j--;
}
else if(flag[i][j]==2) ///如果是斜向右標記
j--;
else if(flag[i][j]==3) ///如果是斜向下標記
i--;
}
for(i=k-1;i>=0;i--)
printf("%c",res[i]);
}
結果
時間復雜度:
由于只需要填一個m行n列的二維數組,其中m代表第一個字符串長度,n代表第二個字符串長度,所以時間復雜度為O(m*n)。
原文鏈接:https://blog.csdn.net/weixin_55764157/article/details/124417492
相關推薦
- 2022-03-20 Android自動攔截與接聽功能APK黑白名單_Android
- 2022-04-17 mac 使用zsh vscode和終端node默認版本不一致 (nvm node版本管理工具)
- 2022-03-31 SQL?Server的觸發器詳解_MsSql
- 2022-11-28 Spark?GraphX?分布式圖處理框架圖算法詳解_相關技巧
- 2022-05-10 詳解CLR的內存分配和回收機制_C#教程
- 2022-09-23 opencv實現車牌識別_python
- 2022-08-15 python?time模塊時間戳?與?結構化時間詳解_python
- 2022-09-10 python中的隨機數種子seed()用法說明_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支