Minimum Number of Operations to Make String Sorted LeetCode solution in C++
1const int MOD = 1e9 + 7;2const int N = 3010;34long f[N];5long g[N];67long qmi(long a, int k) {8long res = 1;9while (k != 0) {10if ((k & 1) == 1) {11res = res * a % MOD;12}13k >>= 1;14a = a * a % MOD;15}16return res;17}1819int init = []() {20f[0] = g[0] = 1;21for (int i = 1; i < N; ++i) {22f[i] = f[i - 1] * i % MOD;23g[i] = qmi(f[i], MOD - 2);24}25return 0;26}();2728class Solution {29public:30int makeStringSorted(string s) {31int cnt[26]{};32for (char &c : s) {33++cnt[c - 'a'];34}35int n = s.size();36long ans = 0;37for (int i = 0; i < n; ++i) {38int m = 0;39for (int j = 0; j < 26; ++j) {40if (j < s[i] - 'a') {41m += cnt[j];42}43}44long t = m * f[n - i - 1] % MOD;45for (int j = 0; j < 26; ++j) {46t = t * g[cnt[j]] % MOD;47}48ans = (ans + t) % MOD;49--cnt[s[i] - 'a'];50}51return ans;52}53};