1625. Lexicographically Smallest String After Applying Operations
Description
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 ofs
(0-indexed). Digits post9
are cycled back to0
. For example, ifs = "3456"
anda = 5
,s
becomes"3951"
. - Rotate
s
to the right byb
positions. For example, ifs = "3456"
andb = 1
,s
becomes"6345"
.
Return the lexicographically smallest string you can obtain by applying the above operations any number of times on s
.
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'
.
Example 1:
Input: s = "5525", a = 9, b = 2 Output: "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 then "2050".
Example 2:
Input: s = "74", a = 5, b = 1 Output: "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 then "24".
Example 3:
Input: s = "0011", a = 4, b = 2 Output: "0011" Explanation: There are no sequence of operations that will give us a lexicographically smaller string than "0011".
Constraints:
2 <= s.length <= 100
s.length
is even.s
consists of digits from0
to9
only.1 <= a <= 9
1 <= b <= s.length - 1
Solution
lexicographically-smallest-string-after-applying-operations.py
class Solution:
def findLexSmallestString(self, s: str, a: int, b: int) -> str:
n = len(s)
deq, seen, res = deque([s]), {s}, s
while deq:
c = deq.popleft()
res = min(res, c)
A = list(c)
for i in range(1,n,2):
A[i] = str(((int(A[i])+a)%10))
A = "".join(A)
if A not in seen:
seen.add(A)
deq.append(A)
rotate = c[b:] + c[:b]
if rotate not in seen:
seen.add(rotate)
deq.append(rotate)
return res