LeetCode in Kotlin

2380. Time Needed to Rearrange a Binary String

Medium

You are given a binary string s. In one second, all occurrences of "01" are simultaneously replaced with "10". This process repeats until no occurrences of "01" exist.

Return the number of seconds needed to complete this process.

Example 1:

Input: s = “0110101”

Output: 4

Explanation:

After one second, s becomes “1011010”.

After another second, s becomes “1101100”.

After the third second, s becomes “1110100”.

After the fourth second, s becomes “1111000”.

No occurrence of “01” exists any longer, and the process needed 4 seconds to complete, so we return 4.

Example 2:

Input: s = “11100”

Output: 0

Explanation: No occurrence of “01” exists in s, and the processes needed 0 seconds to complete, so we return 0.

Constraints:

Follow up:

Can you solve this problem in O(n) time complexity?

Solution

class Solution {
    fun secondsToRemoveOccurrences(s: String): Int {
        var lastOne = -1
        var result = 0
        var prevResult: Int
        var curResult = 0
        var countOne = 0
        var countZero = 0
        var diff: Int
        var pTarget: Int
        var pWait: Int
        var cTarget: Int
        for (i in 0 until s.length) {
            if (s[i] == '0') {
                ++countZero
                continue
            }
            ++countOne
            diff = i - lastOne - 1
            prevResult = curResult
            cTarget = countOne - 1
            pTarget = cTarget - 1
            pWait = prevResult - (lastOne - pTarget)
            curResult = if (diff > pWait) {
                countZero
            } else {
                if (countZero == 0) 0 else pWait - diff + 1 + countZero
            }
            result = curResult
            lastOne = i
        }
        return result
    }
}