You are given a string s of even length consisting of digits from 0 to
9, and two integers a and b.
You can apply either of the following two operations any number of times and in any order on s:
Add a to all odd indices of s(0-indexed). Digits post 9 are cycled back to 0. For example, if s = "3456" and a = 5, s becomes "3951".
Rotate s to the right by b positions. For example, if s = "3456" and b = 1, s becomes "6345".
Return thelexicographically smallest string you can obtain by applying the above operations any number of times ons.
A string a is lexicographically smaller than a string b (of the same length) if in the first position where a and b differ, string a has a letter that appears earlier in the alphabet than the corresponding letter in
b. For example, "0158" is lexicographically smaller than "0190" because the first position they differ is at the third letter, and '5' comes before
'9'.
Input: s ="5525", a =9, b =2Output: "2050"Explanation: We can apply the following operations:Start: "5525"Rotate: "2555"Add: "2454"Add: "2353"Rotate: "5323"Add: "5222"Add: "5121"Rotate: "2151"Add: "2050"There is no way to obtain a string that is lexicographically smaller than "2050".
Input: s ="74", a =5, b =1Output: "24"Explanation: We can apply the following operations:Start: "74"Rotate: "47"Add:"42"Rotate:"24"There is no way to obtain a string that is lexicographically smaller than "24".
Input: s ="0011", a =4, b =2Output: "0011"Explanation: There are no sequence of operations that will give us a lexicographically smaller string than "0011".
Since both operations (add and rotate) can be applied any number of times, and the string is of even length, we can use BFS or DFS to explore all reachable strings. We keep track of visited states to avoid cycles and always update the answer with the lexicographically smallest string found.
classSolution {
public: string findLexSmallestString(string s, int a, int b) {
unordered_set<string> vis;
queue<string> q;
string ans = s;
q.push(s);
vis.insert(s);
while (!q.empty()) {
string cur = q.front(); q.pop();
if (cur < ans) ans = cur;
// Add a to odd indices
string t = cur;
for (int i =1; i < t.size(); i +=2) t[i] = (t[i]-'0'+a)%10+'0';
if (!vis.count(t)) { vis.insert(t); q.push(t); }
// Rotate by b
t = cur.substr(cur.size()-b) + cur.substr(0, cur.size()-b);
if (!vis.count(t)) { vis.insert(t); q.push(t); }
}
return ans;
}
};
classSolution {
public String findLexSmallestString(String s, int a, int b) {
Set<String> vis =new HashSet<>();
Queue<String> q =new LinkedList<>();
String ans = s;
q.add(s);
vis.add(s);
while (!q.isEmpty()) {
String cur = q.poll();
if (cur.compareTo(ans) < 0) ans = cur;
// Add a to odd indiceschar[] t = cur.toCharArray();
for (int i = 1; i < t.length; i += 2) t[i]= (char)((t[i]-'0'+a)%10 +'0');
String tstr =new String(t);
if (vis.add(tstr)) q.add(tstr);
// Rotate by b tstr = cur.substring(cur.length()-b) + cur.substring(0, cur.length()-b);
if (vis.add(tstr)) q.add(tstr);
}
return ans;
}
}
classSolution {
funfindLexSmallestString(s: String, a: Int, b: Int): String {
val vis = mutableSetOf<String>()
val q = ArrayDeque<String>()
var ans = s
q.add(s)
vis.add(s)
while (q.isNotEmpty()) {
val cur = q.removeFirst()
if (cur < ans) ans = cur
// Add a to odd indices
val t = cur.toCharArray()
for (i in1 until t.size step 2) t[i] = ((t[i]-'0'+a)%10 + '0'.toInt()).toChar()
val tstr = String(t)
if (vis.add(tstr)) q.add(tstr)
// Rotate by b
val rot = cur.takeLast(b) + cur.dropLast(b)
if (vis.add(rot)) q.add(rot)
}
return ans
}
}
classSolution:
deffindLexSmallestString(self, s: str, a: int, b: int) -> str:
from collections import deque
vis = set()
q = deque([s])
ans = s
vis.add(s)
while q:
cur = q.popleft()
if cur < ans:
ans = cur
# Add a to odd indices t = list(cur)
for i in range(1, len(t), 2):
t[i] = str((int(t[i]) + a) %10)
tstr =''.join(t)
if tstr notin vis:
vis.add(tstr)
q.append(tstr)
# Rotate by b tstr = cur[-b:] + cur[:-b]
if tstr notin vis:
vis.add(tstr)
q.append(tstr)
return ans
⏰ Time complexity: O(N^2) in the worst case, where N is the length of s (since the number of unique states is bounded by the number of possible strings).
🧺 Space complexity: O(N^2), for the visited set and queue.