解题思路:
中心思想: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分
46 人评分
#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 2024-03-07 09:32:41 |
小于时,反转后的数一定比输入的原数小,就不用判断了。这个函数F的目的在于判断反转后子串是不是变小了(相应的,反转后的整个字符串是否变小了)。
题解有问题吧,主函数里内层循环r的循环条件是错的
#include<stdio.h> #include<iostream> #include<string> using namespace std; string s; int compare(int i, int j) { while (i < j) { if (s[i] < s[j]) return 0; if (s[j] < s[i]) return 1; else { i++; j--; } } } int main() { getline(cin, s); int n = s.length(), count = 0; for (int i = 0; i < n - 1; i++) for (int j = i + 1; j < n; j++) { if (compare(i, j) == 1) { count++; } } cout << count; return 0; }
我请想问一下,当两个数相同l++,r--,如果s[l] > s[r]成立ans++,但这种情况在主函数里循环到这个l和r的时候ans不会再加一次么?
#include<iostream> #include<cstring> #include<sstream> using namespace std; string s; int F(int r, int l) { while (l < r) { if (s[l] < s[r])return 0; else if (s[l] > s[r])return 1; else { l ++; r --; } } } int main() { getline(cin, s); int n = s.length(),count=0; for (int l = 0; l <= n - 2; l++) { for (int r = n - 1; r > l; r--) { if (F(r, l))count++; } } cout << count; }
C语言程序设计教程(第三版)课后习题3.7 (C语言代码)浏览:746 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:672 |
printf基础练习2 (C语言代码)浏览:321 |
C语言程序设计教程(第三版)课后习题10.2 (C语言代码)浏览:564 |
【求[X,Y]内被除3余1并且被除5余3的整数的和】 (C语言代码)浏览:703 |
C语言程序设计教程(第三版)课后习题4.9 (C语言代码)浏览:727 |
矩阵加法 (C语言代码)浏览:1768 |
1013题解浏览:596 |
分糖果 (C语言代码)浏览:980 |
字符逆序 (C语言代码)浏览:541 |