杨雨彤


私信TA

用户名:dotcpp0724648

访问量:2218

签 名:

菜鸡也会想变强啊

等  级
排  名 4949
经  验 1615
参赛次数 0
文章发表 20
年  龄 21
在职情况 学生
学  校 大庆师范学院
专  业 软件工程

  自我简介:

解题思路:

一开始想的炒鸡复杂,想着000,001,010这样的往里填,每填一次统计一次子串数量,填几次统计几次子串数量最后取最大的

如果我一开始填000就是最佳方案,但我其实不知道它是,我就得回填到111最后再判断这个字符串里得子串数量,时间复杂度很大

那如果全都是问号呢,我岂不是有n个问好,有2^n种回填方案,每个方案都得统计一次子串数量,想想看是非常不合理的。

后来我想明白❓到底是什么,不是我给它规定好值的,而是根据我想它是几就是几

举个例子

111???此时最大子串数量是3,是怎么想的呢?首先01(下标)相同,子串+1,此时跳到2,2的下一个是?我想23是一对子串那么?必须得是1,此时子串数+1

调到4,4如果是问好,不管下一个是问好还是0还是1我子串数都可以+1,因为问好处可以是0也可以是1,我只想凑对。

每次比较i和i+1

分三种情况

一:如果两个字符相同,count++,找到一对子串。i+2跳到下一对字符即从0 1比较跳到 2和3得字符比较

二:如果两个字符中有问好,count++,我会根据两个当中的另一个配,如果另一个是1我就可以让问好是1,如果另一个是0我就让问好是0

如果另一个也是问好 ,我可以让它两是00或11都行,找到一对后,i+2,跳到下一对的比较

三:如果以上两种情况都没有即两个字符不同且不含问好,例如01 ,10是真的无法配对,这时候就舍弃i,让i+1,从i+1开始往后配对



注意事项:

参考代码:

import java.io.*;

/**
 * @Author:杨雨彤
 * @date:2024/1/30 14:52
 */
public class Main {
    static BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
    static PrintWriter pw=new PrintWriter(new OutputStreamWriter(System.out));
    public static void main(String[] args) throws IOException {
        String  s = br.readLine();
        int i=0;
        int len=s.length();
        int count=0;
        while(i<len-1){
            if(s.charAt(i)==(s.charAt(i+1))){
                i+=2;
                count++;
            } else if (s.charAt(i)=='?'||s.charAt(i+1)=='?') {
                count++;
                i+=2;
            }else{
                i+=1;
            }
        }
        pw.println(count);
        pw.flush();
        pw.close();
    }
}


 

0.0分

2 人评分

  评论区

  • «
  • »