UVA 401(palindorme)简单字符串处理
来源:互联网 发布:lucie wilde 知乎 编辑:程序博客网 时间:2024/05/19 18:16
入门的字符串处理,小心为妙。
坑爹的注意空格输出
#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;bool is_p(char *s,int len)//判断是否为回文注意下标{ for(int i=0;i<len/2;i++) { if(s[i]!=s[len-i-1]) return 0; } return 1;}bool mirror(char *s,int len)//判断是否为镜面{ for(int i=0;i<(len+1)/2;i++) { if(s[i]!=s[len-i-1])//判端过程略先累赘 { if((s[i]=='E'&&s[len-i-1]=='3')||(s[i]=='3'&&s[len-i-1]=='E')) continue; else if((s[i]=='J'&&s[len-i-1]=='L')||(s[i]=='L'&&s[len-i-1]=='J')) continue; else if((s[i]=='S'&&s[len-i-1]=='2')||(s[i]=='2'&&s[len-i-1]=='S')) continue; else if((s[i]=='Z'&&s[len-i-1]=='5')||(s[i]=='5'&&s[len-i-1]=='Z')) continue; else return 0; } else { if(s[i]=='A'||s[i]=='H'||s[i]=='T'||s[i]=='I'||s[i]=='M'||s[i]=='O'||s[i]=='U'||s[i]=='V'||s[i]=='W'||s[i]=='X'||s[i]=='Y'||s[i]=='1'||s[i]=='8') continue; else return 0; } } return 1;}int main(){ int len; char s[50]; while(~scanf("%s",s)) { len=strlen(s); if(!is_p(s,len)&&!mirror(s,len)) { printf("%s -- is not a palindrome.\n\n",s); } else if(is_p(s,len)&&!mirror(s,len)) { printf("%s -- is a regular palindrome.\n\n",s); } else if(!is_p(s,len)&&mirror(s,len)) { printf("%s -- is a mirrored string.\n\n",s); } else if(is_p(s,len)&&mirror(s,len)) { printf("%s -- is a mirrored palindrome.\n\n",s); } } return 0;}
上面写的代码是很冗余的
所以贴上大牛的优化:
点击打开链接
第二个函数is_mirrored(),这个函数是此题的核心问题
其实也不难写,有些细节问题要注意
首先可以用两个数组把题目中的表格存起来,我看有位同学用了20多个if else 太狠了,用数组存应该是比较好的办法了。
char const *ch = "AEHIJLMOSTUVWXYZ12358";
char const *re = "A3HILJMO2TUVWXY51SEZ8";
然后在函数内部首先要对只有一个字符的字符串进行特殊情况判断:
if(len == 1)
{
for(j=0; j<table_len; j++)
{
if(ch[j] == str[0])
break;
}
if(j == 21 || re[j] != str[0])
return 0;
}
为什么不用在下面的主循环判断中通过修改判断条件(把i<len/2改为i<len/2+1,这样就比刚才多往后判断一个字符,可以排除len=1时循环一次也不执行的问题)for(i=0; i<len/2 + 1; i++)来排除这个特殊情况呢?
因为这样的话,在多个字符的字符串判定时,每次都要多扫一次,还不如这样来的好些(个人看法)
这个问题解决之后,那就没什么问题了,函数如下:
int is_mirrored(char *str){int table_len = strlen(ch);int i,j,len = strlen(str);if(len == 1){for(j=0; j<table_len; j++){if(ch[j] == str[0])break;}if(j == 21 || re[j] != str[0])return 0;}else if(len > 1)for(i=0; i<len/2; i++){for(j=0; j<table_len; j++){if(ch[j] == str[i])break;}if(j == 21 || re[j] != str[len-i-1])return 0;}return 1;}
- UVA 401(palindorme)简单字符串处理
- uva 401 Palindromes(字符串处理)
- uva 401 Palindromes(字符串回文处理)
- Automatic Poetry - UVa 10361 简单字符串处理
- UVA - 1339 Ancient Cipher :简单字符串处理
- UVa 401 Palindromes(简单字符串)
- Palindromes - UVa 401 字符串处理
- UVA - 1368 DNA Consensus String :简单字符串处理
- UVA - 10340 All in All :简单字符串处理
- uva 401 Palindromes(基本的字符串处理)
- uva 10361 Automatic Poetry(字符串处理)
- uva 537 Artificial Intelligence?(字符串处理)
- uva 644 Immediate Decodability(字符串处理)
- uva 409 Excuses, Excuses!(字符串处理)
- uva 502 DEL command(字符串处理)
- uva 1339 Ancient Cipher(字符串处理)
- UVa 455 - Periodic Strings(字符串处理)
- uva 1339 Ancient Cipher(字符串处理)
- 不是技术牛人,如何拿到国内IT巨头的Offer
- jQuery Mobile (一)hello jquerymobile
- 函数调用方式
- Java -- AWT , GUI图形界面
- grid control阈值设置
- UVA 401(palindorme)简单字符串处理
- 及时释放系统资源 防止电脑运行卡解决方案
- 排序合并连接(sort merge join)的原理
- 数据结构之堆排序
- 计算机视觉、模式识别、机器学习常用牛人主页链接
- cocos2d-x实例学习(14)之CCBlink
- sigaction 浅析
- linux 下查看系统资源和负载,以及性能监控(学习使用)
- setTimeout, setInteval,process.nextTick