class Solution(object):
def longestSubstring(self, s, k):
"""
:type s: str
:type k: int
:rtype: int (returns the length of the longest substring)
"""
i = 0
max_len = 0
counts = {}
for j in range(len(s)):
counts[s[j]] = counts.get(s[j], 0) + 1
while max(ord(ch) for ch in counts) - min(ord(ch) for ch in counts) > k:
counts[s[i]] -= 1
if counts[s[i]] == 0:
del counts[s[i]] # Remove key so it doesn't affect min/max
i += 1
current_len = j - i + 1
if current_len > max_len:
max_len = current_len
return max_len
Y2xhc3MgU29sdXRpb24ob2JqZWN0KToKICAgIGRlZiBsb25nZXN0U3Vic3RyaW5nKHNlbGYsIHMsIGspOgogICAgICAgICIiIgogICAgICAgIDp0eXBlIHM6IHN0cgogICAgICAgIDp0eXBlIGs6IGludAogICAgICAgIDpydHlwZTogaW50IChyZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhlIGxvbmdlc3Qgc3Vic3RyaW5nKQogICAgICAgICIiIgogICAgICAgIGkgPSAwCiAgICAgICAgbWF4X2xlbiA9IDAKICAgICAgICBjb3VudHMgPSB7fSAKICAgICAgICAKICAgICAgICBmb3IgaiBpbiByYW5nZShsZW4ocykpOgogICAgICAgICAgIAogICAgICAgICAgICBjb3VudHNbc1tqXV0gPSBjb3VudHMuZ2V0KHNbal0sIDApICsgMQogICAgICAgICAgICAKICAgICAgICAgICAKICAgICAgICAgICAgd2hpbGUgbWF4KG9yZChjaCkgZm9yIGNoIGluIGNvdW50cykgLSBtaW4ob3JkKGNoKSBmb3IgY2ggaW4gY291bnRzKSA+IGs6CiAgICAgICAgICAgICAgICBjb3VudHNbc1tpXV0gLT0gMQogICAgICAgICAgICAgICAgaWYgY291bnRzW3NbaV1dID09IDA6CiAgICAgICAgICAgICAgICAgICAgZGVsIGNvdW50c1tzW2ldXSAgIyBSZW1vdmUga2V5IHNvIGl0IGRvZXNuJ3QgYWZmZWN0IG1pbi9tYXgKICAgICAgICAgICAgICAgIGkgKz0gMQogICAgICAgICAgICAKICAgICAgCiAgICAgICAgICAgIGN1cnJlbnRfbGVuID0gaiAtIGkgKyAxCiAgICAgICAgICAgIGlmIGN1cnJlbnRfbGVuID4gbWF4X2xlbjoKICAgICAgICAgICAgICAgIG1heF9sZW4gPSBjdXJyZW50X2xlbgogICAgICAgICAgICAgICAgCiAgICAgICAgcmV0dXJuIG1heF9sZW4K