字符消除 hihoCoder1039
来源:互联网 发布:除螨仪有用吗 知乎 编辑:程序博客网 时间:2024/05/21 21:42
题意: 向给定的字符串中插入一个字符(A、B 或 C),然后消除左右相同的字符,问插入某一个位置后最多能够消除多少个字符。
思路: 字符串长度不超过 100,T 不超过 100,数据比较小,暴力枚举一下插入的位置也不会超时。所以思路就是暴力枚举每一个插入的位置,然后求出能够消除的字符个数,取最大的即是最终结果。
代码:
还是那个问题,不同的思路实现起来一点都不一样,有的都不知道怎么实现,还容易出错,有的就简单易懂,所以找到一个好思路很重要。
比如,这道题消除字符过程中,本来想的是记录上一个字符然后和当前的字符比较看是否相同,实现起来很烦。。还 WA 了。后来直接判断当前字符和左右字符有没有相同的,实现起来就很简单了。
下面的程序消除字符用的是迭代。
#include<cstdio>#include<cstring>#include<cstdlib>#include<stack>#include<queue>#include<utility>#include<vector>#include<cmath>#include<set>#include<map>#include<iostream>#include<algorithm>#include<sstream>using namespace std;typedef long long LL;int T;char str[110];char str1[110];char str2[110];int f(){ bool ok = true; int sum = strlen(str1); while(ok){ ok = false; //用 ok 记录当前这个循环是否还有被消去的字符,如果没有则没有必要再进行循环了 int len = strlen(str1); int len2 = 0; if(len <= 1){ continue; } else if(str1[0] != str1[1]){ str2[len2++] = str1[0]; } else if(str1[0] == str1[1]){ ok = true; } for(int i=1; i<len-1; i++){ if(str1[i]==str1[i-1] || str1[i]==str1[i+1]){ ok = true; } else{ str2[len2++] = str1[i]; } } if(str1[len-1] != str1[len-2]){ str2[len2++] = str1[len-1]; } else{ ok = true; } str2[len2] = '\0'; strcpy(str1, str2); } return sum - strlen(str1);}int main(){ //freopen("in.txt", "r", stdin); while(scanf("%d", &T) == 1){ while(T--){ scanf("%s", str); int sum = strlen(str); int ans = 0; int tmpans; str1[0] = 'A'; for(int i=0; i<=sum; i++){ str1[i+1] = str[i]; } tmpans = f(); ans = max(ans, tmpans); str1[0] = 'B'; for(int i=0; i<=sum; i++){ str1[i+1] = str[i]; } tmpans = f(); ans = max(ans, tmpans); str1[0] = 'C'; for(int i=0; i<=sum; i++){ str1[i+1] = str[i]; } tmpans = f(); ans = max(ans, tmpans); for(int i=0; i<sum; i++){ int t = 0; for(int j=0; j<=i; j++){ str1[t++] = str[j]; } str1[t++] = 'A'; for(int j=i+1; j<sum; j++){ str1[t++] = str[j]; } tmpans = f(); ans = max(ans, tmpans); t = 0; for(int j=0; j<=i; j++){ str1[t++] = str[j]; } str1[t++] = 'B'; for(int j=i+1; j<sum; j++){ str1[t++] = str[j]; } tmpans = f(); ans = max(ans, tmpans); t = 0; for(int j=0; j<=i; j++){ str1[t++] = str[j]; } str1[t++] = 'C'; for(int j=i+1; j<sum; j++){ str1[t++] = str[j]; } tmpans = f(); ans = max(ans, tmpans); } printf("%d\n", ans); } } return 0;}
看了看别人用 string 写的,string 的 insert 函数用起来太方便了。。。
下面的程序消除字符用的是递归。
#include<cstdio>#include<cstring>#include<cstdlib>#include<stack>#include<queue>#include<utility>#include<vector>#include<cmath>#include<set>#include<map>#include<iostream>#include<algorithm>#include<sstream>using namespace std;typedef long long LL;int T;int Cal(string src){ string dst = ""; int flag = false; int len = src.size(); if(len <= 1){ return 0; } else if(src[0] != src[1]){ dst += src[0]; } else if(src[0] == src[1]){ flag = true; } for(int i=1; i<len-1; i++){ if(src[i]==src[i-1] || src[i]==src[i+1]){ flag = true; } else{ dst += src[i]; } } if(src[len-1] != src[len-2]){ dst += src[len-1]; } else{ flag = true; } //cout << dst << endl; if(flag) return len - dst.size() + Cal(dst); else return len - dst.size();}int main(){ //freopen("in.txt", "r", stdin); while(scanf("%d", &T) == 1){ string src, dst; while(T--){ cin >> src; int len = src.size(); int ans = 0; for(int i=0; i<=len; i++){ dst = src; dst.insert(i, "A"); ans = max(ans, Cal(dst)); dst = src; dst.insert(i, "B"); ans = max(ans, Cal(dst)); dst = src; dst.insert(i, "C"); ans = max(ans, Cal(dst)); } printf("%d\n", ans); } } return 0;}
阅读全文
0 0
- hihoCoder1039 - 字符消除
- hihocoder1039 字符型消除
- [hihocoder1039]字符消除
- 字符消除 hihoCoder1039
- 【hihocoder1039】字符消除——模拟
- hihocoder1039 字符消除 永远不要着急,容不得一丝差错
- hihocoder1039
- 字符消除
- hihocoder1039:字符串
- #1039 : 字符消除
- hihoCoder:#1039 字符消除
- #1039 : 字符消除
- hiho1039字符消除
- #1039 : 字符消除
- hiho 1039 : 字符消除
- HihoCoder#1039:字符消除
- hihocoder #1039 : 字符消除
- hihoCoder 字符消除
- 第三方库引起错误
- 单片机学习心得
- Gson工具 基本API
- Java高级篇-11-可变长参数的使用
- 报错:JPA-style positional param was not an integral ordinal;
- 字符消除 hihoCoder1039
- 用WPS自制表格
- Java web-反射类的学习
- 将cordova集成到android项目中"Error initializing Cordova:Class not found"
- SQL Server的作业中用PowerShell调用bat文件简单Demo
- Android 资源混淆工具
- 配置邮件客户端(无SSL/TLS加密)
- Linux 安装gcc
- 英伟达tk1板的串口数据收发出错问题