Related Articles
Longest equal substring with cost less than K
• Last Updated : 13 Feb, 2020

Given two string X and Y of the same length which consists of lowercase letters and also an integer K. The task is to find the maximum length up to which X can be changed to Y within the given cost K.
The cost of changing a character is given by the absolute difference between the ASCII value of the characters. That is, to change a character at index i, cost = |x[i] – Y[i]|

Examples:

Input: X = abcd, Y = bcde, K = 3
Output: 3
Explanation: A maximum of 3 characters can be changed because the cost to change each article is 1.

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

Approach: The idea is to maintain a prefix array of length N to store the absolute sum of the strings. That is, the cost to change the string X to Y. The following steps can be followed to compute the result:

• Maintain two pointers say i and j.
• In a while loop check if the difference between ith index and jth index of prefix array is greater than given cost or not.
• If the difference is greater than given cost then increase the j pointer to compensate for the cost else increase the i pointer.

Below is the implementation of the above approach:

## CPP

 `// C++ program to find the``// maximum length of equal substring``// within a given cost``#include ``using` `namespace` `std;`` ` `// Function to find the maximum length``int` `solve(string X, string Y, ``int` `N, ``int` `K)``{`` ` `    ``int` `count[N + 1] = { 0 };``    ``int` `sol = 0;``    ``count[0] = 0;`` ` `    ``// Fill the prefix array with``    ``// the difference of letters``    ``for` `(``int` `i = 1; i <= N; i++) {`` ` `        ``count[i] = count[i - 1] + ``abs``(X[i - 1] - Y[i - 1]);``    ``}`` ` `    ``int` `j = 0;`` ` `    ``for` `(``int` `i = 1; i <= N; i++) {``        ``while` `((count[i] - count[j]) > K) {`` ` `            ``j++;``        ``}`` ` `        ``// Update the maximum length``        ``sol = max(sol, i - j);``    ``}`` ` `    ``return` `sol;``}`` ` `// Driver code``int` `main()``{`` ` `    ``int` `N = 4;`` ` `    ``string X = ``"abcd"``, Y = ``"bcde"``;`` ` `    ``int` `K = 3;`` ` `    ``cout << solve(X, Y, N, K) << ``"\n"``;`` ` `    ``return` `0;``}`

## Java

 `// Java program to find the``// maximum length of equal subString``// within a given cost``class` `GFG``{`` ` `// Function to find the maximum length``static` `int` `solve(String X, String Y,``                ``int` `N, ``int` `K)``{`` ` `    ``int` `[]count = ``new` `int``[N + ``1``];``    ``int` `sol = ``0``;``    ``count[``0``] = ``0``;`` ` `    ``// Fill the prefix array with``    ``// the difference of letters``    ``for` `(``int` `i = ``1``; i <= N; i++) ``    ``{`` ` `        ``count[i] = count[i - ``1``] + ``                ``Math.abs(X.charAt(i - ``1``) - ``                ``Y.charAt(i - ``1``));``    ``}`` ` `    ``int` `j = ``0``;`` ` `    ``for` `(``int` `i = ``1``; i <= N; i++)``    ``{``        ``while` `((count[i] - count[j]) > K)``        ``{``            ``j++;``        ``}`` ` `        ``// Update the maximum length``        ``sol = Math.max(sol, i - j);``    ``}`` ` `    ``return` `sol;``}`` ` `// Driver code``public` `static` `void` `main(String[] args)``{`` ` `    ``int` `N = ``4``;``    ``String X = ``"abcd"``, Y = ``"bcde"``;``    ``int` `K = ``3``;`` ` `    ``System.out.print(solve(X, Y, N, K) + ``"\n"``);``}``}`` ` `// This code is contributed by PrinciRaj1992`

## Python3

 `# Python3 program to find the``# maximum length of equal subString``# within a given cost`` ` `# Function to find the maximum length``def` `solve(X, Y, N, K):``    ``count ``=` `[``0``] ``*` `(N ``+` `1``);``    ``sol ``=` `0``;``    ``count[``0``] ``=` `0``;`` ` `    ``# Fill the prefix array with``    ``# the difference of letters``    ``for` `i ``in` `range``(``1``, N ``+` `1``):``        ``count[i] ``=` `(count[i ``-` `1``] ``+``                    ``abs``(``ord``(X[i ``-` `1``]) ``-` `                    ``ord``(Y[i ``-` `1``])));`` ` `    ``j ``=` `0``;`` ` `    ``for` `i ``in` `range``(``1``, N ``+` `1``):``        ``while` `((count[i] ``-` `count[j]) > K):``            ``j ``+``=` `1``;`` ` `        ``# Update the maximum length``        ``sol ``=` `max``(sol, i ``-` `j);`` ` `    ``return` `sol;`` ` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ``N ``=` `4``;``    ``X ``=` `"abcd"``;``    ``Y ``=` `"bcde"``;``    ``K ``=` `3``;`` ` `    ``print``(solve(X, Y, N, K));`` ` `# This code is contributed by PrinciRaj1992`

## C#

 `// C# program to find the ``// maximum length of equal subString ``// within a given cost ``using` `System;`` ` `class` `GFG ``{ ``     ` `    ``// Function to find the maximum length ``    ``static` `int` `solve(``string` `X, ``string` `Y, ``                    ``int` `N, ``int` `K) ``    ``{ ``     ` `        ``int` `[]count = ``new` `int``[N + 1]; ``        ``int` `sol = 0; ``        ``count[0] = 0; ``     ` `        ``// Fill the prefix array with ``        ``// the difference of letters ``        ``for` `(``int` `i = 1; i <= N; i++) ``        ``{ ``     ` `            ``count[i] = count[i - 1] + ``                    ``Math.Abs(X[i - 1] - ``                    ``Y[i - 1]); ``        ``} ``     ` `        ``int` `j = 0; ``     ` `        ``for` `(``int` `i = 1; i <= N; i++) ``        ``{ ``            ``while` `((count[i] - count[j]) > K) ``            ``{ ``                ``j++; ``            ``} ``     ` `            ``// Update the maximum length ``            ``sol = Math.Max(sol, i - j); ``        ``} ``     ` `        ``return` `sol; ``    ``} `` ` `    ``// Driver code ``    ``public` `static` `void` `Main() ``    ``{ ``     ` `        ``int` `N = 4; ``        ``string` `X = ``"abcd"``, Y = ``"bcde"``; ``        ``int` `K = 3; ``     ` `        ``Console.WriteLine(solve(X, Y, N, K) + ``"\n"``); ``    ``} ``} `` ` `// This code is contributed by AnkitRai01`
Output:
```3
```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.

My Personal Notes arrow_drop_up