鱼C论坛

 找回密码
 立即注册
查看: 2174|回复: 2

[技术交流] 125_验证回文串

[复制链接]
发表于 2019-6-17 15:51:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
/*
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
*/


  1. int isNum(char ch)
  2. {
  3.     return ((ch >= '0') && (ch <= '9')) ? 1 : 0;
  4. }

  5. int isChar(char ch)
  6. {
  7.     return (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z'))) ? 1 : 0;
  8. }

  9. bool isPalindrome(char * s)
  10. {
  11.    
  12.     bool    ret_val = true          ; /* init */
  13.     int     len     = strlen(s)     ;
  14.     char*   head    = s             ;
  15.     char*   tail    = &s[len-1]     ;
  16.     char    ch_h    = 0             ;
  17.     char    ch_t    = 0             ;
  18.     int     type_h  = 0             ;
  19.     int     type_t  = 0             ;
  20.    
  21.     while(head < tail)
  22.     {
  23.         
  24.         ch_h    =   (*head)                         ;
  25.         ch_t    =   (*tail)                         ;
  26.         type_h  =   isNum(ch_h) + isChar(ch_h) * 2  ;
  27.         type_t  =   isNum(ch_t) + isChar(ch_t) * 2  ;
  28.         
  29.         if(  (type_h != 0)
  30.            &&(type_t != 0)
  31.         )
  32.         {
  33.             if (type_h != type_t)
  34.             {
  35.                 ret_val = false;
  36.                 break;
  37.             }
  38.             /* 这里可以省略
  39.             else if(type_h==0x01)
  40.             {
  41.                 if(ch_h == ch_t)
  42.                 {
  43.                     head++;
  44.                     tail--;
  45.                     continue;
  46.                 }
  47.                 else
  48.                 {
  49.                     ret_val = false;
  50.                     break;
  51.                 }
  52.                
  53.             }*/
  54.             else
  55.             {
  56.                 if((ch_h|32) == (ch_t|32))
  57.                 {
  58.                     head++;
  59.                     tail--;
  60.                     continue;
  61.                 }
  62.                 else
  63.                 {
  64.                     ret_val = false;
  65.                     break;
  66.                 }
  67.             }
  68.         }
  69.         else if(type_h == 0)    /* head指向非需要比较类型*/
  70.         {
  71.             head++;
  72.         }
  73.         else if(type_t==0)  /* tail指向非需要比较类型*/
  74.         {
  75.             tail--;
  76.         }
  77.     }
  78.    
  79.    
  80.     return ret_val;

  81. }
复制代码


  1. /*
  2. 执行用时 :4 ms, 在所有C提交中击败了96.32%的用户
  3. 内存消耗 :7.4 MB, 在所有C提交中击败了58.22%的用户

  4. 476 / 476 个通过测试用例
  5. 状态:通过
  6. 执行用时:4 ms
  7. 提交时间:0 分钟之前
  8. */
复制代码


Nice.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-6-17 15:56:54 | 显示全部楼层
高级语言可以尝试

1.将不需要比较的元素进行remove 得到s1
2.字符串大写话或小写化 lower upper,得到s2
3.看 s2 == s2.reverse 的结果即可。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-17 16:20:17 | 显示全部楼层
解法二:先筛选,再比较。
缺点: 会破坏s的原有数据。

  1. int isNum(char ch)
  2. {
  3.     return ((ch >= '0') && (ch <= '9')) ? 1 : 0;
  4. }

  5. int isChar(char ch)
  6. {
  7.     return (((ch >= 'a') && (ch <= 'z')) || ((ch >= 'A') && (ch <= 'Z'))) ? 1 : 0;
  8. }

  9. bool isPalindrome(char * s)
  10. {
  11.    
  12.     bool    ret_val     = true          ; /* init */
  13.     int     valid_len   = 0             ;
  14.     int     i           = 0             ;

  15.     i         = 0;
  16.     valid_len = 0;
  17.     while(s[i] != '\0')
  18.     {
  19.         if(isNum(s[i]) || isChar(s[i]))
  20.         {
  21.             s[valid_len] = s[i] | 32;
  22.             valid_len ++;
  23.         }
  24.         i++;
  25.     }
  26.    
  27.     i = 0;
  28.     while( i < valid_len-1 )
  29.     {
  30.         if(s[i] != s[valid_len-1])
  31.         {
  32.             ret_val = false;
  33.             break;
  34.         }
  35.         i++;
  36.         valid_len--;
  37.     }

  38.     return ret_val;
  39. }
复制代码


  1. 执行用时 :
  2. 4 ms
  3. , 在所有C提交中击败了
  4. 96.32%
  5. 的用户
  6. 内存消耗 :
  7. 7.5 MB
  8. , 在所有C提交中击败了
  9. 30.92%
  10. 的用户
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-25 13:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表