输出:
1
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
用例四:
输入:
ababcecfdc
abc
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">
输出:
2
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

python解法

# 定义函数find_seq,用于计算字符串b作为子序列在字符串a中出现的次数
def find_seq(a, b):
    # 将字符串a转换为列表,以便于修改其中的字符
    lst = list(a)
    # 初始化计数器cnt为0
    cnt = 0

    # 当还可以在lst中找到b作为子序列时,继续循环
    while can_find(lst, b):
        # 每次找到一次完整的b作为子序列,就将计数器加1
        cnt += 1

    # 返回最终计数结果
    return cnt

# 辅助函数can_find,用来检查是否可以在当前状态下找到b作为lst的一个子序列
def can_find(lst, b):
    # pa是遍历lst的指针,pb是遍历b的指针
    pa = 0
    pb = 0

    # 遍历lst中的每个字符
    while pa < len(lst):
        # 如果lst[pa]与b[pb]匹配
        if lst[pa] == b[pb]:
            # 将匹配到的字符标记为空格(或可以设置为其他特殊符号),防止重复匹配
            lst[pa] = ' '
            # 移动b的指针
            pb += 1
        # 如果b已经被完整地匹配了一次
        if pb == len(b):
            # 则说明找到了b作为一个子序列,返回True
            return True
        # 不论是否匹配成功,都移动lst的指针
        pa += 1

    # 如果遍历完lst都没有完全匹配到b,则返回False
    return False

# 从用户获取输入
a = input()  # 输入字符串a
b = input()  # 输入字符串b

# 调用find_seq函数,并打印结果
res = find_seq(a, b)
print(res)  # 输出b作为子序列在a中出现的次数
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

java解法

import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        // 读取输入的两个字符串
        String parent = sc.nextLine(); // 父字符串
        String child = sc.nextLine();  // 子字符串

        int length = parent.length();
        // matched数组用于记录parent中每个字符是否已被匹配过
        int[] matched = new int[length];

        int count = 0;  // 计算子序列出现次数
        for (int i = 0; i < length; ) {  // 遍历父字符串
            int j = 0;  // 子字符串的索引
            while (i < length && j < child.length()) {  // 尝试匹配
                if (parent.charAt(i) == child.charAt(j) && matched[i] == 0) {  // 如果字符匹配且未被标记
                    matched[i] = 1;  // 标记当前字符
                    j++;  // 移动子字符串指针
                }
                i++;  // 移动父字符串指针
            }
            if (j == child.length()) {  // 如果子字符串完全匹配
                count++;  // 增加计数
                i = -1;  // 重置i,以便从头开始新的匹配
            }
        }

        System.out.println(count);  // 输出最终计数
    }
}
 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

C++解法

#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"}">

C解法

#include 
#include 

int main() {
    char A[1001], B[1001];
    // 读取输入的两个字符串 A 和 B
    fgets(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; // 标记找到了 B
                    break; // 退出当前匹配循环
                }
            }
        }

        // 如果没有找到完整的 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);
    return 0;
}

 class="hljs-button signin active" data-title="登录复制" data-report-click="{"spm":"1001.2101.3001.4334"}">

JS解法

// 计算字符串 B 在字符串 A 中作为子序列出现的次数
function matchCount(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 中的匹配,并标记已匹配的字符
function findMatch(chars, strB) {
    let idxA = 0; // 字符数组 A 的索引
    let idxB = 0; // 字符串 B 的索引

    // 遍历字符数组 A
    while (idxA < chars.length) {
        if (chars[idxA] === strB[idxB]) { // 当字符匹配时
            chars[idxA] = ' '; // 将已匹配的字符标记为空格,避免重复使用
            idxB++; // 移动 B 的指针
        }
        if (idxB === strB.length) { // 如果 B 中所有字符都匹配成功
            return true; // 返回找到匹配
        }
        idxA++; // 移动 A 的指针
    }

    return false; // 如果没有找到完整的 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"}">

注意:

如果发现代码有用例覆盖不到的情况,欢迎反馈!会在第一时间修正,更新。

注:本文转载自blog.csdn.net的CodeClimb的文章"https://blog.csdn.net/CodeClimb/article/details/144217090"。版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。如有侵权,请联系我们删除。
复制链接

评论记录:

未查询到任何数据!