Given a string of length n and a non-negative integer k. Find k distant string of given string. Distance between two letters is the 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 exist multiple solutions. We need 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 the 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. The 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:
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.
JavaScript
<script>
// JavaScript program to find the k distant string
// function to find the
// lost string
function findKDistantString(str,k)
{
let n = str.length;
for (let i = 0; i < n; ++i) {
let best_letter = str[i];
let best_distance = 0;
for (let maybe = 97; maybe <= 122; ++maybe)
{
let distance = Math.abs(maybe - str.charCodeAt(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 = String.fromCharCode(maybe);
}
}
// decrease the remaining
// distance
k -= best_distance;
str = str.replace(str[i],best_letter);
}
// we found a correct
// string only if "k == 0"
if (k == 0)
return str;
else
return "No";
}
// driver function
let str = "bear";
let k = 26;
document.write(findKDistantString(str, k),"</br>");
str = "af";
k = 7;
document.write(findKDistantString(str, k),"</br>");
// This code is contributed by shinjanpatra
</script>
Time Complexity: O(n), where n is the size of the given string.
Auxiliary Space: O(1), no extra space is required, so it is a constant.
Similar Reads
Substring meaning in DSA
A substring is defined as a contiguous part of a string, i.e., a string inside another string. Substrings of String "geeks"Characteristics of Substring: Starting position of a substring is greater than or equal to the starting index of the string and the ending position is less than or equal to the
2 min read
Java Strings
In Java, a String is the type of object that can store a sequence of characters enclosed by double quotes, and every character is stored in 16 bits, i.e., using UTF 16-bit encoding. A string acts the same as an array of characters. Java provides a robust and flexible API for handling strings, allowi
9 min read
String in Data Structure
A string is a sequence of characters. The following facts make string an interesting data structure.Small set of elements. Unlike normal array, strings typically have smaller set of items. For example, lowercase English alphabet has only 26 characters. ASCII has only 256 characters.Strings are immut
3 min read
Distinct Substring frequency counter
Given a string s of length N containing only lowercase English letters and an integer K, the task is to find all distinct substrings of S of length K, and for each substring, count the number of times it occurs in S. You need to return a list of all distinct substrings along with their frequency of
4 min read
std::string class in C++
C++ has in its definition a way to represent a sequence of characters as an object of the class. This class is called std:: string. The string class stores the characters as a sequence of bytes with the functionality of allowing access to the single-byte character.String vs Character ArrayStringChar
8 min read
Longest substring having K distinct vowels
Given a string s we have to find the length of the longest substring of s which contain exactly K distinct vowels. Note: Consider uppercase and lowercase characters as two different characters. Examples: Input : s = "tHeracEBetwEEntheTwo", k = 1 Output : 14 Explanation : Longest substring with only
13 min read
Count substrings with k distinct characters
Given a string s consisting of lowercase characters and an integer k, the task is to count all possible substrings (not necessarily distinct) that have exactly k distinct characters. Examples: Input: s = "abc", k = 2Output: 2Explanation: Possible substrings are ["ab", "bc"]Input: s = "aba", k = 2Out
10 min read
String, Subsequence & Substring
What is a Substring? A substring is a contiguous part of a string, i.e., a string inside another string. In general, for an string of size n, there are n*(n+1)/2 non-empty substrings. For example, Consider the string "geeks", There are 15 non-empty substrings. The subarrays are: g, ge, gee, geek, ge
6 min read
strcspn() in C
The strcspn() is a part of the C standard library, it is defined in the <string.h> header file in C. The strcsspn function is used to find the number of characters in the given string before the 1st occurrence of a character from the defined set of characters or string. Syntax of strcspn()Cstr
3 min read
What is String - Definition & Meaning
In Data Structures and Algorithms (DSA), a String can also be defined as a sequence of characters, stored in contiguous memory locations, terminated by a special character called the null character '\0'. StringCharacteristics of String: In the context of Data Structures and Algorithms, strings have
3 min read