#include
#include
using namespace std;
int main() {
string A, B;
// 从输入读取两个字符串 A 和 B
getline(cin, A);
getline(cin, B);
int count = 0; // 记录 B 在 A 中出现的次数
size_t a_index = 0, b_index = 0;
// 循环查找字符串 B 在 A 中的出现次数
while (true) {
b_index = 0;
// 遍历字符串 A,查找与 B 匹配的子序列
for (size_t i = 0; i < A.size(); ++i) {
if (A[i] == B[b_index]) { // 当 A 中字符与 B 中字符匹配时
++b_index; // 移动 B 的指针
if (b_index == B.size()) { // 如果 B 中所有字符都匹配成功
++count; // 增加匹配计数
break; // 退出当前匹配循环
}
}
}
// 如果 B 没有完全匹配,则结束循环
if (b_index != B.size()) {
break;
}
// 将已匹配的部分替换为 '0',避免重复匹配
size_t start = 0;
for (size_t i = 0; i < A.size(); ++i) {
if (A[i] == B[start]) { // 当找到匹配字符时
A[i] = '0'; // 将 A 中匹配的字符替换为 '0'
++start; // 移动 B 的指针
if (start == B.size()) { // 如果所有字符都被匹配并替换
break; // 结束替换过程
}
}
}
}
// 输出 B 在 A 中的出现次数
cout << count << endl;
return 0;
}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
C解法
解题思路
从输入读取字符串 A 和 B,并去掉末尾的换行符,以方便后续处理。
使用循环遍历字符串 A,查找字符串 B 作为子序列出现的次数。
每找到一次完整匹配的 B,将匹配到的字符替换为 '0',避免重复匹配同样的字符。
当无法找到完整匹配的 B 时结束循环,输出匹配次数。
通过逐步替换已匹配的字符确保同一个字符不会被重复使用,从而准确统计 B 作为子序列在 A 中的出现次数。
#include#includeintmain(){char A[1001], B[1001];// 读取输入的两个字符串 A 和 Bfgets(A,sizeof(A),stdin);fgets(B,sizeof(B),stdin);// 去掉字符串末尾的换行符
A[strcspn(A,"\n")]=0;
B[strcspn(B,"\n")]=0;int count =0;// 记录 B 在 A 中的出现次数while(1){int b_index =0;int found =0;// 检查是否能找到 B 作为子序列在 A 中出现for(size_t i =0; i <strlen(A);++i){if(A[i]== B[b_index]){// 当 A 中字符与 B 中字符匹配时++b_index;// 移动 B 的指针if(b_index ==strlen(B)){// 如果 B 中所有字符都匹配成功++count;// 增加匹配计数
found =1;// 标记找到了 Bbreak;// 退出当前匹配循环}}}// 如果没有找到完整的 B,则结束循环if(b_index !=strlen(B)){break;}// 将已匹配的部分替换为 '0',避免重复匹配size_t start =0;for(size_t i =0; i <strlen(A);++i){if(A[i]== B[start]){// 当找到匹配字符时
A[i]='0';// 将 A 中匹配的字符替换为 '0'++start;// 移动 B 的指针if(start ==strlen(B)){// 如果所有字符都被匹配并替换break;// 结束替换过程}}}}// 输出 B 在 A 中的出现次数printf("%d\n", count);return0;}
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
JS解法
解题思路
使用 matchCount 函数计算字符串 B 在字符串 A 中作为子序列出现的次数。
将字符串 A 转换为字符数组,方便在找到匹配后标记字符。
使用 findMatch 函数在字符数组中查找 B 的匹配,匹配成功后将匹配的字符标记为空格,防止重复使用。
重复查找,直到无法找到完整的匹配,最后返回匹配的次数。
使用 readline 模块从标准输入读取字符串 A 和 B,计算匹配次数并输出结果
// 计算字符串 B 在字符串 A 中作为子序列出现的次数functionmatchCount(strA, strB){const chars = strA.split('');// 将字符串 A 转换为字符数组,方便修改let count =0;// 记录 B 在 A 中的出现次数// 不断查找字符串 B,直到找不到为止while(true){if(!findMatch(chars, strB))break;// 如果找不到匹配则退出循环
count++;// 找到一次完整匹配,计数加一}return count;// 返回匹配次数}// 查找 B 作为子序列在 A 中的匹配,并标记已匹配的字符functionfindMatch(chars, strB){let idxA =0;// 字符数组 A 的索引let idxB =0;// 字符串 B 的索引// 遍历字符数组 Awhile(idxA < chars.length){if(chars[idxA]=== strB[idxB]){// 当字符匹配时
chars[idxA]=' ';// 将已匹配的字符标记为空格,避免重复使用
idxB++;// 移动 B 的指针}if(idxB === strB.length){// 如果 B 中所有字符都匹配成功returntrue;// 返回找到匹配}
idxA++;// 移动 A 的指针}returnfalse;// 如果没有找到完整的 B,返回 false}const readline =require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let inputA ='';let inputB ='';// 从标准输入读取两个字符串
rl.on('line',(input)=>{if(!inputA){
inputA = input;// 读取第一个字符串 A}else{
inputB = input;// 读取第二个字符串 B
rl.close();}});// 当输入完成后,计算匹配次数并输出结果
rl.on('close',()=>{const result =matchCount(inputA, inputB);
console.log(result);// 输出 B 在 A 中的出现次数});
class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
评论记录:
回复评论: