Lexicographically Smallest String After Operations With Constraint
Problem​
You are given a string s
and an integer k
.
Define a function distance(s1, s2)
between two strings s1
and s2
of the same length n
as:
The sum of the minimum distance between s1[i]
and s2[i]
when the characters from 'a'
to 'z'
are placed in a cyclic order, for all i
in the range [0, n - 1]
.
For example, distance("ab", "cd") == 4
, and distance("a", "z") == 1
.
You can change any letter of s
to any other lowercase English letter, any number of times.
Return a string denoting the
lexicographically smallest
string t
you can get after some changes, such that distance(s, t) <= k
.
Examples​
Example 1:
Input: s = "zbbz"
, k = 3
Output: "aaaz"
Explanation:
Change s to "aaaz". The distance between "zbbz" and "aaaz" is equal to k = 3
.
Example 2:
Input: s = "xaxcd"
, k = 4
Output: "aawcd"
Explanation:
The distance between "xaxcd" and "aawcd" is equal to k = 4
.
Constraints​
s
consists only of lowercase English letters.
Approach​
1. Conversion to Character Array:​
char[] result = s.toCharArray()
;: This line converts the input string s into a character array named result. This array will hold the modified string.
2. Iterating Through Characters:​
The function uses an outer for loop to iterate through each character i in the original string s.
3. Finding the Best Replacement Character:​
An inner for loop iterates through all lowercase letters char c = 'a'; c <= 'z'; c++
.
Inside the inner loop:
-
distance(s.charAt(i), c): This calculates the distance between the current character s[i] and the candidate replacement character c using a separate distance function (assumed to be defined elsewhere).
-
if
(distance(s.charAt(i), c) <= k):
This checks if changing the current character to c is allowed within the k limit based on the distance.
If the distance is less than or equal to k:
result[i] = c
;: The character in the result array at position i is updated with the new character c.k -= distance(s.charAt(i), c)
;: The remaining allowed changes (k) are decremented by the distance used for this replacement.- break;: The inner loop exits as a suitable replacement has been found within the limit.
4. Returning the Modified String:​
return new String(result);: This line converts the modified character array result back into a String object and returns it.
Solution​
Code in Java​
class Solution {
public int distance(char s1, char s2) {
int diff = Math.abs(s1 - s2);
return Math.min(diff, 26 - diff);
}
public String getSmallestString(String s, int k) {
char[] result = s.toCharArray();
for (int i = 0; i < s.length(); i++) {
for (char c = 'a'; c <= 'z'; c++) {
if (distance(s.charAt(i), c) <= k) {
result[i] = c;
k -= distance(s.charAt(i), c);
break;
}
}
}
return new String(result);
}
}
Complexity Analysis​
Time Complexity: ​
Reason: In the worst case, the inner loop runs completely for every character in the outer loop (if all characters need to be replaced). This leads to a total of n * k iterations.
Space Complexity: ​
Reason: The space complexity of the provided code is dominated by the character array result used to store the modified string.