蓝桥杯3503 更小的数

问题描述

小蓝有一个长度均为 n 且仅由数字字符 0∼9 组成的字符串,下标从 0 到 n−1,你可以将其视作是一个具有 n 位的十进制数字 num,小蓝可以从 num 中选出一段连续的子串并将子串进行反转,最多反转一次。

小蓝想要将选出的子串进行反转后再放入原位置处得到的新的数字 num_new​ 满足条件 num_new<num,请你帮他计算下一共有多少种不同的子串选择方案,只要两个子串在 num 中的位置不完全相同我们就视作是不同的方案。

注意,我们允许前导零的存在,即数字的最高位可以是 0,这是合法的。

输入格式

输入一行包含一个长度为 n 的字符串表示 num(仅包含数字字符 0∼9),从左至右下标依次为 0∼n−1。

输出格式

输出一行包含一个整数表示答案。

样例输入

复制代码
210102

样例输出

复制代码
8

枚举所有子串,对每个子串 s[i..j],用双指针 ij 从两端向中间移动,跳过相同字符,比较第一个不同的字符对,若 s[i] > s[j],则计数

cpp 复制代码
#include<iostream>
#include<cstring>
using namespace std;

const int N = 5e3+10;
string s;

int ans;

//判断子串 s[i..j] 的反转是否比原子串小
void check(int i, int j)
{
	//跳过相同字符
	while(s[i]==s[j] && i<j)
	{
		i++;
		j--;
	}
	//如果所有字符都相同,则反转后子串与原串相同,直接返回 
	if(i>=j) return;
	//反转后的子串比原串小
	if(s[i]>s[j]) ans++;
	return;
}

int main()
{
	cin>>s;
	int len = s.size();
	
	for(int i=0; i<len-1; ++i)
	{
		for(int j=i+1; j<len; ++j)  //确保子串至少有两个字符
		{
			check(i, j);
		}
	}
	
	cout<<ans;
	
	return 0;
}
相关推荐
燃于AC之乐26 分钟前
《算法实战笔记》第10期:六大算法实战——枚举、贪心、并查集、Kruskal、双指针、区间DP
算法·贪心算法·图论·双指针·区间dp·二进制枚举
睡不醒的kun2 天前
不定长滑动窗口-求子数组个数
数据结构·c++·算法·leetcode·职场和发展·双指针·滑动窗口
伟大的车尔尼3 天前
双指针题目:复写零
双指针
拾光Ծ4 天前
【优选算法】双指针算法:专题二
c++·算法·双指针·双指针算法·c++算法·笔试面试
艾莉丝努力练剑7 天前
【优选算法必刷100题】第007~008题(双指针算法):三数之和、四数之和问题求解
linux·算法·双指针·优选算法
老鼠只爱大米9 天前
LeetCode经典算法面试题 #24:两两交换链表中的节点(迭代法、递归法等多种实现方案详细解析)
算法·leetcode·链表·递归·双指针·迭代·链表交换
沉默-_-9 天前
力扣hot100双指针专题解析2(C++)
java·c++·算法·蓝桥杯·双指针
老鼠只爱大米9 天前
LeetCode经典算法面试题 #19:删除链表的倒数第N个结点(双指针、栈辅助法等多种实现方案详细解析)
算法·leetcode·链表·双指针·删除链表节点·一趟扫描
2401_8414956410 天前
【LeetCode刷题】删除链表的倒数第N个结点
数据结构·python·算法·leetcode·链表·遍历·双指针
老鼠只爱大米12 天前
LeetCode经典算法面试题 #160:相交链表(双指针法、长度差法等多种方法详细解析)
算法·leetcode·链表·双指针·相交链表·长度差法