历年CSP-J初赛真题解析 | 2023年CSP-J初赛阅读程序(21-26)

学习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

猜你喜欢

转载自blog.csdn.net/guolianggsta/article/details/133015930