学习C++从娃娃抓起!记录下CSP-J备考学习过程中的题目,记录每一个瞬间。
附上汇总贴:历年CSP-J初赛真题解析 | 汇总_csp历年真题_热爱编程的通信人的博客-CSDN博客
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int f(string x, string y) {
int m = x.size();
int n = y.size();
vector<vector<int>> v(m+1, vector<int>(n+1, 0));
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) { //v[i][j]表示字符串x和y的最长公共子序列的长度。子序列指的是可以在字符串中任意删掉一些字符后剩下的部分,公共子序列则要求同时是两个字符串的子序列
if (x[i-1] == y[j-1]) {
v[i][j] = v[i-1][j-1] + 1;
} else {
v[i][j] = max(v[i-1][j], v[i][j-1]);
}
}
}
return v[m][n];
}
bool g(string x, string y) {
if (x.size() != y.size()) { //先筛去两个字符串长度不一致的情况
return false;
}
return f(x + x, y) == y.size(); //在字符串x尾部再复制一份后进行判断
}
int main() {
string x, y;
cin >> x >> y;
cout << g(x, y) << endl;
return 0;
}
21、f函数的返回值小于等于min(n, m) 。( )
【答案】:对
【解析】
返回两个字符串的最长公共子序列长度,肯定不会超过某一个字符串的长度
22、f函数的返回值等于两个输入字符串的最长公共子串的长度。( )
【答案】:错
【解析】
子串不等于子序列,子串要求字符在原字符串中连续出现,而子序列只有顺序要求
23、当输入两个完全相同的字符串时, g函数的返回值总是true。( )
【答案】:对
【解析】
两个相同的字符串,公共子序列长度等于y字符串的长度,所以正确
24、将第19行中的“v[m][n]”替换为“v[n][m]",那么该程序( )。
A.行为不变
B.只会改变输出
C.一定非正常退出
D.可能非正常退出
【答案】:D
换为v[n][m],可能某一维下标访问会越界,此时会非正常退出。
25、当输入为“csp-j p-jcs”时,输出为( B )
A."0"
B."1"
C."T"
D."F"
【答案】:B
【解析】
如果一看代码就知道是求最长公共子序列,那直接可以得到答案。如果不了解,可以尝试打表,二维列表中的元素值为v[i][j]。具体打完的表如下:
i 0 1 2 3 4 5
j 0 0 0 0 0 0 0
1 0 0 0 0 1 1
2 0 0 0 0 1 2
3 0 1 1 1 1 2
4 0 1 2 2 2 2
5 0 1 2 3 3 3
6 0 1 2 3 4 4
7 0 1 2 3 4 5
8 0 1 2 3 4 5
9 0 1 2 3 4 5
10 0 1 2 3 4 5
v[5][5]等于5,与y字符串长度相同,选B
26、当输入为“csppsc spsccp”时,输出为( D )。
A."T"
B."F"
C."0"
D."1"
【答案】:D
【解析】
同25题,如果一下子看出是求最长公共子序列,那直接可以得到答案。如果不了解,可以尝试打表,二维列表中的元素值为v[i][j]。具体打完的表如下:
i 0 1 2 3 4 5 6
j 0 0 0 0 0 0 0 0
1 0 0 0 0 1 1 1
2 0 1 1 1 1 1 1
3 0 1 2 2 2 2 2
4 0 1 2 2 2 2 3
5 0 1 2 3 3 3 3
6 0 1 2 3 4 4 4
7 0 1 2 3 4 5 5
8 0 1 2 3 4 5 5
9 0 1 2 3 4 5 6
10 0 1 2 3 4 5 6
11 0 1 2 3 4 5 6
12 0 1 2 3 4 5 6
v[14][6]等于6,与y字符串长度相同,选D