LCS
LCS
题面翻译
题目描述:
给定一个字符串 $s$ 和一个字符串 $t$ ,输出 $s$ 和 $t$ 的最长公共子序列。
输入格式:
两行,第一行输入 $s$ ,第二行输入 $t$ 。
输出格式:
输出 $s$ 和 $t$ 的最长公共子序列。如果有多种答案,输出任何一个都可以。
说明/提示:
数据保证 $s$ 和 $t$ 仅含英文小写字母,并且 $s$ 和 $t$ 的长度小于等于3000。
题目描述
文字列 $ s $ および $ t $ が与えられます。 $ s $ の部分列かつ $ t $ の部分列であるような文字列のうち、最長のものをひとつ求めてください。
输入格式
入力は以下の形式で標準入力から与えられる。
$ s $ $ t $
输出格式
$ s $ の部分列かつ $ t $ の部分列であるような文字列のうち、最長のものをひとつ出力せよ。 答えが複数ある場合、どれを出力してもよい。
样例 #1
样例输入 #1
1 | axyb |
样例输出 #1
1 | axb |
样例 #2
样例输入 #2
1 | aa |
样例输出 #2
1 | aa |
样例 #3
样例输入 #3
1 | a |
样例输出 #3
1 |
样例 #4
样例输入 #4
1 | abracadabra |
样例输出 #4
1 | aaadara |
提示
注釈
文字列 $ x $ の部分列とは、$ x $ から $ 0 $ 個以上の文字を取り除いた後、残りの文字を元の順序で連結して得られる文字列のことです。
制約
- $ s $ および $ t $ は英小文字からなる文字列である。
- $ 1\ \leq\ |s|,\ |t|\ \leq\ 3000 $
Sample Explanation 1
答えは axb
または ayb
です。 どちらを出力しても正解となります。
Sample Explanation 3
答えは `` (空文字列) です。
题解
题目解析
一道LCS题,LCS最长个数是经典DP问题,不用我多说了.这一次需要把最长的LCS输出,也相当于一个模板吧.但是这个功能的写法我RE了八次,整整八次……
简单解释一下,dp数组中存储的信息其实已经蕴含了LCS的构造信息了,我们需要的是利用dp数组中的信息反推出我们LCS是怎么构造的.
具体方法是:
- 首先定义两个指针,都初始化为它们各自的尾部位置.
- 如果两个指针的位置所在的字符相同,则把这个字符加到答案串里.
- 如果两个指针所在位置的字符不相同,则分为两个情况:
- 如果
dp[i][j] == dp[i][j-1]
也就是说j位置和j-1位置是等价的,我们就把j所在指针往前移动. - 如果
dp[i][j] == dp[i-1][j]
也就是说i位置和i-1位置是等价的,我们就把i所在指针往前移动.
- 如果
最后答案串就是我们的输出结果,注意我们是从后往前遍历,所以答案串要从后往前加.
AC代码
1 |
|
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Xunyoyo!