3 solutions

  • 3
    @ 2021-12-31 20:38:56

    贪心思想:若想要最大的k,则只需要在保证相邻子串不同的条件下让子串最短即可 代码:

    #include <bits/stdc++.h>
    using namespace std;
    string a,b,c;
    int main(){
    	cin>>a;
    	int sum=1;
    	int t=a.length();
    	b+=a[0];
    	for(int i=1;i<t;i++){
    		c+=a[i];
    		if(b!=c) sum++,b=c,c.clear();
    	}
    	cout<<sum;
    	return 0;
    }
    • 1
      @ 2022-1-17 22:35:20

      贪心:值得注意的是本题只用考虑子串一个字符和两个的情况,在贪心的思想下不会出现大于两个字符的子串,比如kkakk可以理解为k,kak,k,但在贪心的思想下会背优先分解为kk,a,kk,所以本题只用考虑前后项之间的关系

      #include<iostream>
      #include<cstring>
      using namespace std;
      
      char a[200007];
      int ans=1;
      
      int main(){
      
      	cin>>a;
      
      	int n=strlen(a);
      	for(int i=1;i<n;i++){
      		if(a[i]!=a[i-1])ans++;
      		else a[i+1]='0';
      	}
      
      	cout<<ans;
      
      	return 0;
      }
      
      • @ 2022-1-17 22:41:42

        ps:"else a[i+1]='0';"这个主要是为了处理很多个相同字符相连的情况,如果第i+1与i和i-1项相同,如aaa会切成aa,a,为了使第i+1项有效得到相加令其为非字母可,如果不同令其非字母不影响计数

    • 0
      @ 2022-3-25 17:38:16
      #include <bits/stdc++.h>
      using namespace std;
      int main(){
          string s,tmp;
          int num = 1;
          cin>>s;
          tmp = s.substr(0,1);
          for(int i = 1 ; i < s.length() ; i){
              if(tmp == s.substr(i,1)){
              	if(i + 2 > s.length()){//查看是否还有2个字符空间
              		break;
      			}
              	tmp = s.substr(i,2);
              	i += 2;
              	num++;
      		}
      		else{
      			tmp = s.substr(i,1);
      			i += 1;
      			num++;
      		}
      	
          }
          cout<<num<<endl;
          return 0;
      }
      
      • 1

      Information

      ID
      113
      Time
      1000ms
      Memory
      256MiB
      Difficulty
      6
      Tags
      # Submissions
      127
      Accepted
      37
      Uploaded By