PAT1093 Count PAT's (25)(逻辑题)
发布日期:2025-05-01 23:09:41 浏览次数:12 分类:精选文章

本文共 1344 字,大约阅读时间需要 4 分钟。

为了解决寻找字符串中 PAT 子串的问题,我们可以使用以下方法:

方法思路

问题要求我们在一个只包含字符 'P'、'A'、'T' 的字符串中找到所有可能的 PAT 子串的数量。我们可以通过以下步骤来解决这个问题:

  • 预先计算左边的 P 数量:从左到右遍历字符串,记录每个位置左边的 'P' 的数量累积。
  • 预先计算右边的 T 数量:从右到左遍历字符串,记录每个位置右边的 'T' 的数量累积。
  • 遍历每个 'A' 的位置:对于每个遇到的 'A',计算其左边的 'P' 数量和右边的 'T' 数量的乘积,并将结果累加到总数中。
  • 这种方法的时间复杂度是 O(n),其中 n 是字符串的长度。通过预先计算左右两边的数量,避免了多次遍历,从而提高了效率。

    解决代码

    #include 
    using namespace std;int main() { string s; cin >> s; int n = s.size(); if (n == 0) return 0; vector
    left_p(n, 0); vector
    right_t(n, 0); // 计算左边的P数量累积 left_p[0] = (s[0] == 'P') ? 1 : 0; for (int i = 1; i < n; ++i) { left_p[i] = left_p[i-1] + (s[i] == 'P' ? 1 : 0); } // 计算右边的T数量累积 right_t[n-1] = (s[n-1] == 'T') ? 1 : 0; for (int i = n-2; i >= 0; --i) { right_t[i] = right_t[i+1] + (s[i] == 'T' ? 1 : 0); } int result = 0; for (int i = 0; i < n; ++i) { if (s[i] == 'A') { result = (result + left_p[i] * right_t[i]) % 1000000007; } } printf("%d", result); return 0;}

    代码解释

  • 读取输入字符串:从标准输入读取字符串 s
  • 初始化数组:创建两个数组 left_pright_t,分别用于存储每个位置左边的 'P' 数量和右边的 'T' 数量。
  • 计算左边的 'P' 数量:从左到右遍历字符串,累积计算每个位置左边的 'P' 的数量。
  • 计算右边的 'T' 数量:从右到左遍历字符串,累积计算每个位置右边的 'T' 的数量。
  • 遍历每个字符:对于每个遇到的 'A',计算其左边的 'P' 数量和右边的 'T' 数量的乘积,并累加到结果中,最后对结果取模。
  • 输出结果:打印最终计算的结果。
  • 这种方法通过预先计算左右两边的数量,确保了每个 'A' 的计算是高效准确的,从而能够快速解决问题。

    上一篇:PATA1038题解(需复习)
    下一篇:Spring组件扫描配置

    发表评论

    最新留言

    路过按个爪印,很不错,赞一个!
    [***.219.124.196]2026年06月15日 07时43分35秒