Given a string of length n and a non-negative integer k. Find k distant string of given string.

Distance between two letters is difference between their positions in the alphabet. for example:

- dist(c, e) = dist(e, c) = 2.
- dist(a, z) = dist(z, a) = 25.

By using this concept, the distance between two strings is the sum of distances of corresponding letters. For example :

- dist(af, hf) = dist(a, h) + dist(f, f) = 7 + 0 = 7.

Given a string and a distance k. Task is to find a string such that distance of the result string is k from given string. If k distant string is not possible, then print “No”.**Note:** There may be exist multiple solutions. We meed to find one of them.

**Examples :**

Input : bear k = 26 Output : zcar Here, dist(bear, zcar) = dist(b, z) + dist(e, c) + + dist(a, a) + dist(r, r) = 24 + 2 + 0 + 0 = 26 Input : af k = 7 Output : hf Here, dist(af, hf) = dist(a, h) + dist(f, f) = 7 + 0 = 7 Input : hey k = 1000 Output : No Explanation : No such string exists.

There is no solution if the given required distance is too big. Think what is the maximum possible distance for the given string. Or the more useful thing — how to construct the lost string to maximize the distance? Treat each letter separately and replace it with the most distant letter. For example, we should replace ‘c’ with ‘z’, and we should replace ‘y’ with ‘a’. To be more precise, for first 13 letters of the alphabet the most distant letter is ‘z’, and for other letters it is ‘a’.

The approach is simple, iterate over letters of the given string and greedily change them. A word “greedily” means when changing a letter, don’t care about the next letters. Generally, there must be distant letters, because there may not be a solution otherwise. For each letter of the given string change it into the most distant letter, unless the total distance would be too big. As letters are changed, decrease the remaining required distance. So, for each letter of the given string consider only letters not exceeding the remaining distance, and among them choose the most distant one.

CPP and JAVA Implementation:

## CPP

`// CPP program to find the k distant string` `#include <bits/stdc++.h>` `using` `namespace` `std;` ` ` `// function to find the` `// lost string` `string findKDistantString(string str, ` `int` `k)` `{` ` ` `int` `n = str.length();` ` ` ` ` `for` `(` `int` `i = 0; i < n; ++i) {` ` ` ` ` `char` `best_letter = str[i];` ` ` `int` `best_distance = 0;` ` ` ` ` `for` `(` `char` `maybe = ` `'a'` `; ` ` ` `maybe <= ` `'z'` `; ++maybe) ` ` ` `{` ` ` `int` `distance = ` `abs` `(maybe - str[i]);` ` ` ` ` `// check if "distance <= k",` ` ` `// so that, the total distance` ` ` `// will not exceed among` ` ` `// letters with "distance <= k"` ` ` `if` `(distance <= k && distance >` ` ` `best_distance) ` ` ` `{` ` ` `best_distance = distance;` ` ` `best_letter = maybe;` ` ` `}` ` ` `}` ` ` ` ` `// decrease the remaining` ` ` `// distance` ` ` `k -= best_distance;` ` ` `str[i] = best_letter;` ` ` ` ` `}` ` ` ` ` `assert` `(k >= 0);` ` ` `// we found a correct` ` ` `// string only if "k == 0"` ` ` `if` `(k > 0)` ` ` `return` `"No"` `;` ` ` `else` ` ` `return` `str;` `}` ` ` `// driver function` `int` `main()` `{` ` ` `string str = ` `"bear"` `;` ` ` `int` `k = 26;` ` ` `cout << findKDistantString(str, k) << endl;` ` ` ` ` `str = ` `"af"` `;` ` ` `k = 7;` ` ` ` ` `cout << findKDistantString(str, k) << endl;` ` ` `return` `0;` `}` |

## Java

`// Java program to find k distant string` `import` `java.util.*;` `import` `java.lang.*;` ` ` `public` `class` `GfG {` ` ` ` ` `// function to find` ` ` `// the lost string` ` ` `public` `static` `String findKDistantString` ` ` `(String str1, ` `int` `k)` ` ` `{` ` ` `int` `n = str1.length();` ` ` `char` `[] str = str1.toCharArray();` ` ` ` ` `for` `(` `int` `i = ` `0` `; i < n; ++i) {` ` ` `char` `best_letter = str[i];` ` ` `int` `best_distance = ` `0` `;` ` ` ` ` `for` `(` `char` `maybe = ` `'a'` `; ` ` ` `maybe <= ` `'z'` `; ++maybe) ` ` ` `{` ` ` `int` `distance = ` ` ` `Math.abs(maybe - str[i]);` ` ` ` ` `// Check if "distance <= k"` ` ` `// so that it should not` ` ` `// exceed the total distance` ` ` `// among letters with "distance` ` ` `// <= k" we choose the most` ` ` `// distant one` ` ` `if` `(distance <= k && distance ` ` ` `> best_distance) ` ` ` `{` ` ` `best_distance = distance;` ` ` `best_letter = maybe;` ` ` `}` ` ` `}` ` ` ` ` `// we decrease the remaining` ` ` `// distance` ` ` `k -= best_distance;` ` ` `str[i] = best_letter;` ` ` `}` ` ` ` ` `assert` `(k >= ` `0` `);` ` ` ` ` `// Correct string only` ` ` `// if "k == 0"` ` ` `if` `(k > ` `0` `)` ` ` `return` `"No"` `;` ` ` `else` ` ` `return` `(` `new` `String(str));` ` ` `}` ` ` `public` `static` `void` `main(String argc[])` ` ` `{` ` ` `String str = ` `"bear"` `;` ` ` `int` `k = ` `26` `;` ` ` `System.out.println(findKDistantString(str, k));` ` ` ` ` `str = ` `"af"` `;` ` ` `k = ` `7` `;` ` ` `System.out.println(findKDistantString(str, k));` ` ` `}` `}` |

## Python3

`# Python implementation to check if` `# both halves of the string have` `# at least one different character` ` ` `MAX` `=` `26` ` ` `# Function which break string into two halves` `# Counts frequency of characters in each half` `# Compares the two counter array and returns` `# true if these counter arrays differ` `def` `function(st):` ` ` `global` `MAX` ` ` `l ` `=` `len` `(st)` ` ` ` ` `# Declaration and initialization` ` ` `# of counter array` ` ` `counter1, counter2 ` `=` `[` `0` `]` `*` `MAX` `, [` `0` `]` `*` `MAX` ` ` ` ` `for` `i ` `in` `range` `(l` `/` `/` `2` `):` ` ` `counter1[` `ord` `(st[i]) ` `-` `ord` `(` `'a'` `)] ` `+` `=` `1` ` ` ` ` `for` `i ` `in` `range` `(l` `/` `/` `2` `, l):` ` ` `counter2[` `ord` `(st[i]) ` `-` `ord` `(` `'a'` `)] ` `+` `=` `1` ` ` ` ` `for` `i ` `in` `range` `(` `MAX` `):` ` ` `if` `(counter2[i] !` `=` `counter1[i]):` ` ` `return` `True` ` ` ` ` `return` `False` ` ` ` ` `# Driver function` `st ` `=` `"abcasdsabcae"` `if` `function(st): ` `print` `(` `"Yes, both halves differ by at least one character"` `)` `else` `: ` `print` `(` `"No, both halves do not differ at all"` `)` ` ` `# This code is contributed by Ansu Kumari` |

## C#

`// C# program to find k distant string` `using` `System;` ` ` `class` `GfG {` ` ` ` ` `// function to find the lost string` ` ` `public` `static` `String findKDistantString` ` ` `(` `string` `str1, ` `int` `k)` ` ` `{` ` ` `int` `n = str1.Length;` ` ` `char` `[]str = str1.ToCharArray();` ` ` ` ` `for` `(` `int` `i = 0; i < n; ++i) {` ` ` `char` `best_letter = str[i];` ` ` `int` `best_distance = 0;` ` ` ` ` `for` `(` `char` `maybe = ` `'a'` `; ` ` ` `maybe <= ` `'z'` `; ++maybe) ` ` ` `{` ` ` `int` `distance = ` ` ` `Math.Abs(maybe - str[i]);` ` ` ` ` `// Check if "distance <= k"` ` ` `// so that it should not` ` ` `// exceed the total distance` ` ` `// among letters with "distance` ` ` `// <= k" we choose the most` ` ` `// distant one` ` ` `if` `(distance <= k && distance ` ` ` `> best_distance) ` ` ` `{` ` ` `best_distance = distance;` ` ` `best_letter = maybe;` ` ` `}` ` ` `}` ` ` ` ` `// we decrease the remaining` ` ` `// distance` ` ` `k -= best_distance;` ` ` `str[i] = best_letter;` ` ` `}` ` ` ` ` `//(k >= 0);` ` ` ` ` `// Correct string only` ` ` `// if "k == 0"` ` ` `if` `(k > 0)` ` ` `return` `"No"` `;` ` ` `else` ` ` `return` `(` `new` `string` `(str));` ` ` `}` ` ` ` ` `// Driver code` ` ` `public` `static` `void` `Main()` ` ` `{` ` ` `string` `str = ` `"bear"` `;` ` ` `int` `k = 26;` ` ` `Console.WriteLine(` ` ` `findKDistantString(str, k));` ` ` ` ` `str = ` `"af"` `;` ` ` `k = 7;` ` ` `Console.Write(` ` ` `findKDistantString(str, k));` ` ` `}` `}` ` ` `// This code is contributed by Nitin millal. ` |

Output:

zcar hf

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. To complete your preparation from learning a language to DS Algo and many more, please refer **Complete Interview Preparation Course****.**

In case you wish to attend live classes with industry experts, please refer **Geeks Classes Live**