1+ /*
2+ 3216. Lexicographically Smallest String After a Swap
3+ https://leetcode.com/problems/lexicographically-smallest-string-after-a-swap/description/
4+
5+ Problem:
6+ Given a string s containing only digits, return the lexicographically smallest string
7+ that can be obtained after swapping adjacent digits in s with the same parity at most once.
8+
9+ Digits have the same parity if both are odd or both are even. For example, 5 and 9, as well as 2 and 4,
10+ have the same parity, while 6 and 9 do not.
11+
12+ Example 1:
13+
14+ Input: s = "45320"
15+
16+ Output: "43520"
17+
18+ Explanation:
19+
20+ s[1] == '5' and s[2] == '3' both have the same parity, and swapping them results in the lexicographically smallest string.
21+
22+ Example 2:
23+
24+ Input: s = "001"
25+
26+ Output: "001"
27+
28+ Explanation:
29+
30+ There is no need to perform a swap because s is already the lexicographically smallest.
31+
32+
33+ Constraints:
34+
35+ 2 <= s.length <= 100
36+ s consists only of digits.
37+ */
38+
39+ /*
40+ Approach:
41+
42+ Checking if the present digit is greater than the next digit, if yes then checking the parity of the digit.
43+ if both have the same parity swap the number. since this operation can be done at max once, break the loop after the first swap.
44+ return the updated number
45+
46+ What is parity of a number?
47+ Parity: the property of an integer of whether it is even or odd
48+
49+ how to check the parity of the number:
50+ - using the & operation on the last bit,
51+ - if (last bit)&1 == 1, means the last bit was 1. means Odd (ex: 3 has a bit representation of 11)
52+ - if (last bit)&1 == 0, means last bit was 0. means Even number ( ex: 2 has a bit representation of 10)
53+
54+ */
55+
56+
57+ /**
58+ * @param {string } s
59+ * @return {string }
60+ */
61+ var getSmallestString = function ( s ) {
62+ let arr = s . split ( '' ) . map ( Number ) ;
63+
64+ const getParity = ( num ) => {
65+ if ( num & 1 === 0 ) return 'even' ;
66+ else return 'odd' ;
67+ }
68+
69+ for ( let i = 0 ; i < s . length - 1 ; i ++ ) {
70+ if ( arr [ i ] > arr [ i + 1 ] && getParity ( arr [ i ] ) === getParity ( arr [ i + 1 ] ) ) {
71+ let tmp = arr [ i + 1 ] ;
72+ arr [ i + 1 ] = arr [ i ] ;
73+ arr [ i ] = tmp ;
74+ break ;
75+ }
76+ }
77+
78+ return arr . join ( '' ) ;
79+ } ;
80+
81+ module . exports . getSmallestString = getSmallestString ;
0 commit comments