🧊🧊🧊新题型
最长公共子序列是基于动态规划思想,判断子序列长度的,这种方法的弊端就是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;
}
好了,今天就补充到这啦,加油加油!( •̀ ω •́ )✧