算法
(暴力枚举) $O(n)$
先预处理出后缀最大字符,然后从后往前找最大的 $i$,满足 $S_i$ 比从 $i + 1$ 开始的后缀最大字符小,而对于当前的 $i$ 必然存在一个合法的 $j$,枚举 $j$ 即可。
C++ 代码
#include <bits/stdc++.h>
using std::cin;
using std::cout;
using std::max;
using std::string;
using std::vector;
int main() {
int n;
cin >> n;
string s;
cin >> s;
vector<char> a(n);
a[0] = s[n - 1];
for (int i = n - 2; i >= 0; --i) a[i] = max(a[i + 1], s[i]);
int i;
for (i = n - 2; i >= 0; --i) {
if (s[i] < a[i]) break;
}
int idx;
for (int j = i + 1; j < n; ++j) {
if (s[i] < s[j]) idx = j;
}
if (i == -1) puts("-1");
else cout << i + 1 << " " << idx + 1 << '\n';
return 0;
}