解题思路:

        中心思想:s[l] > s[r]则满足条件,答案的个数+1。

        详细解释:考虑s的所有子串[l,r], l即left,是子串的起始下标,r即right是子串的末尾下标,判断s[l] 和 s[r]的大小关系:

                若s[l] > s[r]则该子串反转后,新串<原串,满足条件,答案数+1;

                若s[l] = s[r]则将子串区间[l,r]缩小为[l+1,r-1],再判断s[l+1]和s[r-1]的大小关系;

                若s[l] < s[r]则该子串反转后,新串>原串,不满足条件。


注意事项:

         注意l和r的取值范围(详见代码注释)。

参考代码:

#include<iostream>
#include<string>
using namespace std;
string s;
int F(int l, int r) {
	while (l < r) {
		if (s[l] > s[r])return 1;//如果s[l] > s[r],反转后满足条件 新字符串<原字符串。
		else if (s[l] == s[r]) { l++;r--; }//如果s[l] == s[r],两边同时缩小区间。
		else break;//如果s[l] < s[r],不用继续考虑,反转后一定不满足条件,直接退出循环
	}
	return 0;
}
int main(){
	cin >> s;
	int n = s.length();//n是字符串长度
	int ans = 0;//记录答案
	for (int l = 0;l <= n - 2;l++) {//l即left是子串的起始下标,从0开始到n-2(子串长度至少为2,最右侧的最小子串下标为[n-2,n-1],故l最多到n-2)
		for (int r = n - 1;r > l;r--) {//r即right是子串的末尾下标,从s的最末下标n-1到l+1。
			if(F(l,r))ans++;
		}
	}
	cout << ans;
	return 0;
}


点赞(0)
 

0.0分

31 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 20 条评论

墨散 9月前 回复TA
这样写时间不是O(n^3)了吗,为什么时间能过呢?
无人化 9月前 回复TA
@李泽琦 @uq_38683301381 你上面那位是正解
jkkkk 10月前 回复TA
@Kira 内存的循环条件不应该是从n-1到1嘛不应该是n-1到二呀 我试了把内循环的r >l改成》=1还是可以通过的
jkkkk 10月前 回复TA
@Kira 不是
jkkkk 10月前 回复TA
@ieykzhou @dotcpp0728680 因为有的格式这两个并不统一
wstcwyt 10月前 回复TA
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int ans=0;
	string num;
	cin>>num;
	for(int l=0;l<=num.length()-2;l++)
		for(int r=l+1;r<=num.length()-1;r++)
		{
			int i=l;
			int j=r;
			while(i<j)
			{
				if(num[i]<num[j])	break;
				if(num[i]>num[j]){
					ans++;
					break;
				}
				if(num[i]=num[j]){
					++i;
					--j;
				}
			}
		}
		cout<<ans<<endl;
		return 0;
}
jun11 10月前 回复TA
@Kira 没错啊,外层循环确定了子串的左端下标,内层循环在当前左端下标下,按照子串的右端下标逐渐变小直至到达l+1为止,一次内层循环代表产生一个子串,随着内层循环次数增加,当前以外层循环的l为起始下标的子串越来越短。
jun11 10月前 回复TA
@听 小于时,反转后的数一定比输入的原数小,就不用判断了。这个函数F的目的在于判断反转后子串是不是变小了(相应的,反转后的整个字符串是否变小了)。
10月前 回复TA
为什么不是小于的时候也一样再缩减范围呢,缩减之后的范围有可能满足条件啊
Coleeee 10月前 回复TA
@ieykzhou if(s[i]<s[j])时不能直接return 0,不然就会出问题,但是不知道为什么,兄弟找到原因了吗