《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减

简介: 《蓝桥杯每日一题》双指针·AcWing 3768. 字符串删减

1.题目


给定一个由 n 个小写字母构成的字符串。


现在,需要删掉其中的一些字母,使得字符串中不存在连续三个或三个以上的 x。


请问,最少需要删掉多少个字母?


如果字符串本来就不存在连续的三个或三个以上 x,则无需删掉任何字母。


输入格式

第一行包含整数 n。


第二行包含一个长度为 n的由小写字母构成的字符串。


输出格式

输出最少需要删掉的字母个数。


数据范围

3≤n≤100


样例


输入样例16xxxiii输出样例11输入样例25xxoxx输出样例20输入样例310xxxxxxxxxx输出样例38


2.题目分析


题目要求的就是给定字符串ss中连续出现′x′的子串。

对于每一个长度len>=3 的x子串, 更新ans+=len−2。


于是我们可以枚举这样的x子串。注意到如果我们统计过(l,r)的x子串,那么我们无需也不能再统计(l,r−1)的x子串,当然也不会再统计(l+1,r−1)的子串。于是双指针性质成立,r指针始终不会减少。由此得到时间复杂度O(n))的做法。


3.Ac代码


import java.io.*;
public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        String s = br.readLine();
        int res=0;
        for(int l=1,r=1;l<=n;l++){
            r=l;  //右边界从左边界开始,并不断右移
            //减 1是因为字符下标从0开始,双指针从1开始
            while (r<=n && s.charAt(r-1)=='x')  r++;
            int len=r-l; //字符串长度
            if(len>=3) res+=len-2;
            l=r; //查询完一次连续的,更新左边界到最右边
        }
        System.out.println(res);
    }
}


感谢你能看完, 如有错误欢迎评论指正,有好的思路可以交流一波,如果对你有帮助的话,点个赞支持下

相关文章
C4.
|
3月前
|
存储 程序员 C语言
C语言中如何通过指针引用字符串
C语言中如何通过指针引用字符串
C4.
42 0
|
3月前
|
算法 Java C语言
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-581 字符串调整
第十四届蓝桥杯集训——练习解题阶段(无序阶段)-ALGO-581 字符串调整
39 1
|
3月前
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
【每日一题Day301】LC2337移动片段得到字符串 | 双指针 计分
38 0
|
3月前
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
【每日一题Day150】LC1616分割两个字符串得到回文串 | 双指针+贪心
27 0
|
3月前
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
【每日一题Day117】LC1234替换子串得到平衡字符串 | 双指针
32 0
|
3月前
|
算法 C语言
通过指针引用字符串
通过指针引用字符串
35 1
|
2月前
|
Java
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
2022蓝桥杯大赛软件类国赛Java大学B组 左移右移 空间换时间+双指针
27 3
|
2月前
|
Java
蓝桥杯-动态规划专题-子数组系列,双指针
蓝桥杯-动态规划专题-子数组系列,双指针
|
3月前
|
存储 C++
C++程序中的字符串与指针
C++程序中的字符串与指针
24 2
|
3月前
|
C语言
C语言指针与字符串
C语言指针与字符串
16 0