题目描述
小蓝有一个长度均为 n 且仅由数字字符 0 ∼ 9 组成的字符串,下标从 0 到 n − 1,你可以将其视作是一个具有 n 位的十进制数字 num,小蓝可以从 num 中选出一段连续的子串并将子串进行反转,最多反转一次。小蓝想要将选出的子串进行反转后再放入原位置处得到的新的数字 numnew 满足条件 numnew < num,请你帮他计算下一共有多少种不同的子串选择方案,只要两个子串在 num 中的位置不完全相同我们就视作是不同的方案。
注意,我们允许前导零的存在,即数字的最高位可以是 0 ,这是合法的。
解题思路
考虑将字符串用两层循环进行遍历,对于每一个子串,判断两头的数字大小,若右边比左边小,即为满足题意的子串,若右边和左边相等,则用双指针不断向中间靠拢进行比较,直到右边比左边小则方案加一或右边比左边大则该子串反转不满足题意。
附代码
cpp
#include<bits/stdc++.h>
using namespace std;
int main() {
string str;
cin >> str;
int count = 0;
for (int i = 0; i < str.length(); i++) {
for (int j = i + 1; j < str.length(); j++) {
int l = i, r = j;
while (l<r) {
if (str[r] < str[l])
{
count++; break;
}
else if (str[r] > str[l])
break;
else {
l++;
r--;
}
}
}
}
cout << count;
return 0;
}