解题思路:
中心思想: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分
31 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#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; }