UVA 401(palindorme)简单字符串处理
2013-11-01 08:24
471 查看
入门的字符串处理,小心为妙。
坑爹的注意空格输出
上面写的代码是很冗余的
所以贴上大牛的优化:
点击打开链接
第二个函数is_mirrored(),这个函数是此题的核心问题
其实也不难写,有些细节问题要注意
首先可以用两个数组把题目中的表格存起来,我看有位同学用了20多个if else
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/awkward.gif)
太狠了,用数组存应该是比较好的办法了。
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++)来排除这个特殊情况呢?
因为这样的话,在多个字符的字符串判定时,每次都要多扫一次,还不如这样来的好些(个人看法)
这个问题解决之后,那就没什么问题了,函数如下:
坑爹的注意空格输出
#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
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/awkward.gif)
太狠了,用数组存应该是比较好的办法了。
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; }
相关文章推荐
- Automatic Poetry - UVa 10361 简单字符串处理
- UVA - 1368 DNA Consensus String :简单字符串处理
- uva 401(简单字符处理题)
- UVA - 1339 Ancient Cipher :简单字符串处理
- UVA - 10340 All in All :简单字符串处理
- uva 401 Palindromes(字符串回文处理)
- uva 401 Palindromes(字符串处理)
- uva 401 Palindromes(基本的字符串处理)
- Palindromes - UVa 401 字符串处理
- UVa 401 Palindromes(简单字符串)
- 用perl对文件中的字符串做处理的一个简单的示例
- wertyu(简单的字符串处理问题)
- POJ 1002(不用排序的方法)(简单的字符串处理程序)
- uva140Bandwidth带宽——字符串处理加全排列
- python字符串处理简单优化
- UVA 156 Ananagrams 模拟+字符串处理
- uva 401 字符串
- PHP处理字符串的简单方法
- scanf()与sscanf()学习,简单的字符串处理。
- [ACM_模拟] UVA 12504 Updating a Dictionary [字符串处理 字典增加、减少、改变问题]