|  | @@ -1,3 +1,51 @@
 | 
	
		
			
				|  |  | -func characterReplacement(s string, k int) int {
 | 
	
		
			
				|  |  | -	
 | 
	
		
			
				|  |  | +type SegmentTree struct {
 | 
	
		
			
				|  |  | +	tree []int
 | 
	
		
			
				|  |  | +	size int
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func newST(n int) SegmentTree {
 | 
	
		
			
				|  |  | +	return SegmentTree{
 | 
	
		
			
				|  |  | +		tree: make([]int, 2*n),
 | 
	
		
			
				|  |  | +		size: n,
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func (st SegmentTree) add(i, val int) {
 | 
	
		
			
				|  |  | +	i += st.size
 | 
	
		
			
				|  |  | +	st.tree[i] += val
 | 
	
		
			
				|  |  | +	for 1 < i {
 | 
	
		
			
				|  |  | +		j := i / 2
 | 
	
		
			
				|  |  | +		st.tree[j] = maxInt(st.tree[2*j], st.tree[2*j+1])
 | 
	
		
			
				|  |  | +		i = j
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func maxInt(x, y int) int {
 | 
	
		
			
				|  |  | +	if x < y {
 | 
	
		
			
				|  |  | +		return y
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return x
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func characterReplacement(s string, k int) (max int) {
 | 
	
		
			
				|  |  | +	n := len(s)
 | 
	
		
			
				|  |  | +	if n-1 <= k {
 | 
	
		
			
				|  |  | +		return n
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	bytes := []byte(s)
 | 
	
		
			
				|  |  | +	st := newST(26)
 | 
	
		
			
				|  |  | +	fast, slow, cnt := 0, 0, 0
 | 
	
		
			
				|  |  | +	for ; fast < n; fast++ {
 | 
	
		
			
				|  |  | +		st.add(int(bytes[fast]-'A'), 1)
 | 
	
		
			
				|  |  | +		cnt = st.tree[1]
 | 
	
		
			
				|  |  | +		for cnt+k < fast-slow+1 {
 | 
	
		
			
				|  |  | +			st.add(int(bytes[slow]-'A'), -1)
 | 
	
		
			
				|  |  | +			slow++
 | 
	
		
			
				|  |  | +			cnt = st.tree[1]
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +		max = maxInt(max, fast-slow+1)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 |