How to Count Consecutive Characters in Java


The challenge

Given a string s, the power of the string is the maximum length of a non-empty substring that contains only one unique character.

Return the power of the string.

Example 1:

Input: s = "meetme"
Output: 2
Explanation: The substring "ee" is of length 2 with the character 'e' only

Example 2:

Input: s = "abbcccddddeeeeedcba"
Output: 5
Explanation: The substring "eeeee" is of length 5 with the character 'e' only.

Example 3:

Input: s = "triplepillooooow"
Output: 5

Example 4:

Input: s = "hooraaaaaaaaaaay"
Output: 11

Example 5:

Input: s = "tourist"
Output: 1

Constraints:

  • 1 <= s.length <= 500
  • s contains only lowercase English letters.

The solution in Java code

We could look at something like this:

class Solution {
    public int maxPower(String s) {
        int max = 1;
        
        for(int i=0,j=1; j<s.length(); j++){
            
            if(s.charAt(i)!=s.charAt(j)){
                max = Math.max(j-i,max);
                i=j;
            }
        }
       return Math.max(j-i,max); 
        
    }
}

But in cases like eeeee, we would expect a return of 5, but would instead get 1 back.

So let’s revisit:

class Solution {
    public int maxPower(String s) {
        int max = 1;
        int cnt = 1;
        char prv = s.charAt( 0 );
        
        for( int i = 1; i < s.length(); i++) {
            if( prv == s.charAt( i ) ) {
                max = Math.max( ++cnt, max );
                continue;
            }

            prv = s.charAt( i );
            cnt = 1;
        }
        
        return max;
    }
}

A possible third option would be to do something like this:

class Solution {
    public int maxPower(String s) {
       
        int max=1;
        
        for(int i=1; i<s.length(); i++){
            
            int count=1;
            while(i < s.length() && s.charAt(i-1) == s.charAt(i)){
                count++;
                i++;
                max=Math.max(count, max);
            }
        }
        
        return max;
    }
}