classSolution: defisSubstringPresent(self, s: str) -> bool: t = s[::-1] for i inrange(len(s) - 1): for j inrange(i + 2, len(s) + 1): ss = s[i:j] if ss in t: returnTrue returnFalse
classSolution: defminimumDeletions(self, word: str, k: int) -> int: cnt = Counter(word) arr = list(cnt.values()) res = inf for i inrange(len(arr)): left = sum(x for x in arr if x < arr[i] - k) right = sum(x - arr[i] for x in arr if x > arr[i]) res = min(res, left + right) left = sum(x for x in arr if x < arr[i]) right = sum(x - arr[i] - k for x in arr if x > arr[i] + k) res = min(res, left + right) return res
classSolution: defminimumMoves(self, nums: List[int], k: int, maxChanges: int) -> int: n = len(nums) res = inf ssum = [0] * (n + 1) psum = [0] * (n + 1) for i, x inenumerate(nums): ssum[i + 1] = ssum[i] + x psum[i + 1] = psum[i] + (i if nums[i] == 1else0)
defcheck(i, j, tot): left = ssum[max(0, i - 1)] - ssum[max(0, i - j)] right = ssum[min(n, i + j + 1)] - ssum[min(i + 2, n)] return left + right >= tot
for i inrange(n): need, cost = k, 0 if nums[i] == 1: need -= 1 if need == 0: res = min(res, cost) continue if i > 0and nums[i - 1] == 1: need -= 1 cost += 1 if need == 0: res = min(res, cost) continue
if i + 1 < n and nums[i + 1] == 1: need -= 1 cost += 1 if need == 0: res = min(res, cost) continue
if maxChanges >= need: cost += need * 2 res = min(res, cost) continue
lo, hi = 2, n diff = 0 cost += 2 * maxChanges need -= maxChanges while lo <= hi: mid = (lo + hi) // 2 if check(i, mid, need): hi = mid - 1 diff = mid else: lo = mid + 1
left = ssum[max(0, i - 1)] - ssum[max(0, i - diff)] right = ssum[min(n, i + diff + 1)] - ssum[min(i + 2, n)] left_sum = psum[max(0, i - 1)] - psum[max(0, i - diff)] right_sum = psum[min(n, i + diff + 1)] - psum[min(i + 2, n)] cost += left * i - left_sum + right_sum - right * i if left + right > need: l = i - max(0, i - diff) r = min(n - 1, i + diff) - i if l >= r: cost -= l else: cost -= r res = min(res, cost) return res
foriin0..n { letmut need = k asi32; letmut cost = 0asi64;
if nums[i] == 1 { need -= 1; if need == 0 { res = min(res, cost); continue; } } if i > 0 && nums[i - 1] == 1 { need -= 1; cost += 1; if need == 0 { res = min(res, cost); continue; } }
if i + 1 < n && nums[i + 1] == 1 { need -= 1; cost += 1; if need == 0 { res = min(res, cost); continue; } }
if max_changes >= need { cost += (need * 2) asi64; res = min(res, cost); continue; }
letmut lo = 2; letmut hi = n; letmut diff = 0; cost += (2 * max_changes) asi64; need -= max_changes; while lo <= hi { letmid = (lo + hi) / 2; ifcheck(&ssum, i, mid, need) { hi = mid - 1; diff = mid; } else { lo = mid + 1; } }
letleft = ssum[max(0, (i asi32) - 1) asusize] - ssum[max(0, (i asi32) - (diff asi32)) asusize]; letright = ssum[min(n, i + diff + 1)] - ssum[min(i + 2, n)]; letleft_sum = psum[max(0, (i asi32) - 1) asusize] - psum[max(0, (i asi32) - (diff asi32)) asusize]; letright_sum = psum[min(n, i + diff + 1)] - psum[min(i + 2, n)]; cost += (left asi64) * (i asi64) - left_sum + right_sum - (right asi64) * (i asi64); if left + right > need { letl = i - if i > diff { i - diff } else { 0 }; letr = if i + diff >= n - 1 { 0 } else { i + diff } - i; if l >= r { cost -= l asi64; } else { cost -= r asi64; } } res = min(res, cost); } res } }