正在载入在线练习界面,本页内容可直接阅读…
AK CSP › CSP-S 2022 第一轮真题 › 第20题
CSP-S 2022 第一轮 第20题:f(a,b)与下列()语句的功能最类似。
题目
1 #include <iostream>
2 #include <string>
3 #include <vector>
4
5 using namespace std;
6
7 int f(const string &s, const string &t)
8 {
9 int n = s.length(), m = t.length();
10
11 vector<int> shift(128, m + 1);
12
13 int i, j;
14
15 for (j = 0; j < m; j++)
16 shift[t[j]] = m - j;
17
18 for (i =0; i<= n - m; i += shift[s[i + m]]){
19 j =0;
20 while(j < m && s[i +j] == t[j]) j++;
21 if (j == m) return i;
22 }
23
24 return -1;
25 }
26
27 int main()
28 {
29 string a ,b;
30 cin >> a >> b;
31 cout << f(a, b) << endl;
32 return 0;
33 }
假设输入字符串由 ASCII 可见字符组成,完成下面的判断题和单选题:本小题
f(a, b) 与下列( )语句的功能最类似。
选项
- A. a.find(b)
- B. a.rfind(b)
- C. a.substr(b)
- D. a.compare(b)
答案
A
题解
答案是 A. a.find(b)。
这道题重点看:函数在找什么,以及找到后返回什么。
在 f(a, b) 中,s 对应 a,t 对应 b:
i表示在s中尝试匹配的起始位置。- 第 20 行逐个比较
s[i + j]和t[j]。 - 如果
j == m,说明t的全部字符都匹配成功,第 21 行返回起始下标i。 - 如果始终没有找到,返回
-1。
因此,这个函数的功能是:查找 b 在 a 中第一次出现的位置,下标从 0 开始。 shift 数组用于加快查找,跳过不可能匹配的位置。
例如,a = "abcabc"、b = "bc",函数返回 1。
四个选项的区别:
| 选项 | 功能 |
|---|---|
A. a.find(b) | 查找 b 第一次出现的位置 |
B. a.rfind(b) | 查找 b 最后一次出现的位置 |
C. a.substr(b) | 截取子串,但这里 b 是字符串,参数类型也不对 |
D. a.compare(b) | 按字典序比较两个字符串 |
注意,find 查找失败时返回 string::npos,本函数返回 -1,所以题目说的是功能“最类似”。
真题版权归 CCF 所有,本站仅用于非商业教学用途。页面加载后可直接在线作答,作答记录保存在本浏览器或账号中。 京ICP备2026056990号-1
京公网安备11010502062986号