蓝桥OJ3514 子串简写 (暴力+二分)

子串简写

 一.暴力

思路:

只能通过60%。

从字符串开头遍历,如果遇到c1就进入子遍历,遇到长度大于等于k且以c2结尾的子串就使cnt++;遍历完之后再从外遍历找c1。

这种方法的弊端在于:外遍历

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;

int main()
{
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  int k; cin >> k;
  string s;
  char c1, c2;
  cin >> s >> c1 >> c2;
  int cnt = 0;
  for (int i = 0; i < s.length(); i++)
  {
    if (s[i] == c1)
    {
      for (int j = i+1;j < s.length(); j++)
      {
        if (s[j] == c2 && (j-i+1)>=k) cnt++;
      }
    }
  }
  cout << cnt << '\n';
  return 0;
}

二.二分

学习了b站Turing_Sheep的思路

思路:

#include<bits/stdc++.h>
using namespace std;
const int N = 1e6+10;
using ll = long long;
int main()
{
  ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
  ll k, ans = 0; cin >> k;
  string s;
  char c1, c2;
  cin >> s >> c1 >> c2;
  vector<ll>v;//存储c1位置
  for (ll i = 0; i < s.length(); i++)
  {
    if (s[i] == c1) v.push_back(i);
    if (s[i] == c2)
    {
      if (!v.size() || (i-k+1) < 0) continue;
      int l = 0, r = v.size()-1;
      while(l < r)
      {
        ll mid = l + r + 1 >> 1;
        if (v[mid] <= (i-k+1)) l = mid;
        else r = mid-1;
      }
      if (v[l] <= (i-k+1)) ans += (l+1);
    }
  }
  cout << ans << '\n';
  return 0;
}

相关推荐

  1. P8715 [杯 2020 省 AB2] 值 (双边检测)

    2024-03-30 06:50:04       13 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-30 06:50:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-30 06:50:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-30 06:50:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-30 06:50:04       18 阅读

热门阅读

  1. 开源 | 星星充电、特来电和云快充如何赚钱?

    2024-03-30 06:50:04       48 阅读
  2. 常用的SQL术语和概念

    2024-03-30 06:50:04       18 阅读
  3. 简单工厂模式

    2024-03-30 06:50:04       15 阅读
  4. vue 怎么处理get请求,接收url地址栏参数

    2024-03-30 06:50:04       17 阅读
  5. C++ | getopt配置传参

    2024-03-30 06:50:04       19 阅读
  6. Shell脚本开发(六)——函数

    2024-03-30 06:50:04       17 阅读
  7. MySQL8.0_常用SQL语句 + 常用命令

    2024-03-30 06:50:04       30 阅读