解题思路:
一开始想的炒鸡复杂,想着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 人评分
C语言训练-自守数问题 (C语言代码) long long浏览:1106 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:1045 |
C语言程序设计教程(第三版)课后习题7.4 (C语言代码)浏览:643 |
不会做的浏览:954 |
简单的a+b (C语言代码)浏览:564 |
C语言程序设计教程(第三版)课后习题6.6 (C语言代码)浏览:626 |
淘淘的名单 (C语言代码)浏览:1167 |
WU-整除问题 (C++代码)浏览:648 |
DNA (C语言描述,数据结构)浏览:909 |
模拟计算器 (C语言代码)浏览:2366 |