Drill

ProblemsGo › patterns

The longest run with only two kinds

hardpatternsSliding windowStringsHash mapsGo

A packing line can hold two product types at once before it has to be cleaned down. Given the day’s sequence, find the longest run it could have handled without a change-over.

longestTwoFlavourRun(sequence: string) → int

Go needs a compiler and Drill does not host one yet, so this page is the reference rather than an exercise: the problem, worked examples, and the solution in full. To type it out, the same problem runs in Python.

Solve it in Python →

Where you start

func longestTwoFlavourRun(sequence string) int {
	
}

Worked examples

CallResult
longestTwoFlavourRun("aabbcc")4
longestTwoFlavourRun("abcbbbbcccbdddadacb")10
longestTwoFlavourRun("aaaa")4
longestTwoFlavourRun("ab")2

Hint

Grow a window to the right, keeping a count per character inside it. When a third kind appears, pull the left edge in until one kind is gone.

Reference solution in Go
func longestTwoFlavourRun(sequence string) int {
	counts := map[rune]int{}
	chars := []rune(sequence)
	left, best := 0, 0
	for right := 0; right < len(chars); right++ {
	    counts[chars[right]]++
	    for len(counts) > 2 {
	        counts[chars[left]]--
	        if counts[chars[left]] == 0 {
	            delete(counts, chars[left])
	        }
	        left++
	    }
	    if right-left+1 > best {
	        best = right - left + 1
	    }
	}
	return best
}

The same problem in another language

More patterns problems in Go