Skip to content

Commit 5b3180c

Browse files
authored
Create 1830-minimum-number-of-operations-to-make-string-sorted.js
1 parent 7e5b79b commit 5b3180c

File tree

1 file changed

+40
-0
lines changed

1 file changed

+40
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/**
2+
* @param {string} s
3+
* @return {number}
4+
*/
5+
const makeStringSorted = function (s) {
6+
const mod = BigInt(10 ** 9 + 7),
7+
n = s.length
8+
const a = 'a'.charCodeAt(0)
9+
let ans = 0n
10+
const freq = Array(26).fill(0n)
11+
for (let c of s) {
12+
freq[c.charCodeAt(0) - a]++
13+
}
14+
const fact = Array(n + 1).fill(1n)
15+
for (let i = 1n; i <= n; i++) {
16+
fact[i] = (fact[i - 1n] * i) % mod
17+
}
18+
let l = n
19+
for (let c of s) {
20+
l--
21+
let t = 0n,
22+
rev = 1n
23+
for (let i = 0; i < 26; i++) {
24+
if (i < c.charCodeAt(0) - a) t += freq[i]
25+
rev = (rev * fact[freq[i]]) % mod
26+
}
27+
ans += ((t * fact[l]) % mod) * modpow(rev, mod - 2n)
28+
ans %= mod
29+
freq[c.charCodeAt(0) - a]--
30+
}
31+
return Number(ans)
32+
function modpow(b, p) {
33+
let ans = 1n
34+
for (; p; p >>= 1n) {
35+
if (p & 1n) ans = (ans * b) % mod
36+
b = (b * b) % mod
37+
}
38+
return ans
39+
}
40+
}

0 commit comments

Comments
 (0)