🧊🧊🧊新题型
最长公共子序列是基于动态规划思想,判断子序列长度的,这种方法的弊端就是dp需要很大,如果字符串长度很长就会超出内存限制。这里我们补充一种字符串很长的题型:给出字符串s和字符串t,问s通过删除一些字符能否变成t。简言之,就是t是否是s的非连续子字符串。
这种题目的思想其实很简单,只需要遍历两个字符串然后判断即可,具体我们来看下边这一道题目:



这道题目就是这样的题目,我们来看解决代码:
#include<bits/stdc++.h> 
using namespace std;
char s[100005],t[100005];
int head=1,len;
int main( )
{
    scanf("%s%s",s+1,t+1);
    len=strlen(s+1);
    for(int i=1;i<=len;i++){
        if(s[i]==t[head]) head++;
    }
    if(head>strlen(t+1)) cout<<"Lucky!";
    else cout<<"QAQ Unlucky!";
    return 0;
} 
如果有相等的字符,就后移,最后判断有多少相等的字符。
🧊🧊🧊补充:最长公共子序列模板
#include <bits/stdc++.h>
using namespace std;
int dp[101][101];
int main() {
    string a, b;
    memset(dp, 0, sizeof(dp));
    cin >> a >> b;
    int lena = a.size();
    int lenb = b.size();
    for(int i = 1; i <= lena; ++i) {
        for (int j = 1; j <= lenb; ++j) {
            if(a[i - 1] == b[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1] + 1;
            } else {
                dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
    }
    cout << dp[lena][lenb] << endl;
    return 0;
} 
好了,今天就补充到这啦,加油加油!( •̀ ω •́ )✧


















