zoukankan      html  css  js  c++  java
  • LeetCode(125):验证回文串

    Easy!

    题目描述:

    给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

    说明:本题中,我们将空字符串定义为有效的回文串。

    示例 1:

    输入: "A man, a plan, a canal: Panama"
    输出: true
    

    示例 2:

    输入: "race a car"
    输出: false

    解题思路:

    验证回文字符串是比较常见的问题,所谓回文,就是一个正读和反读都一样的字符串,比如“level”或者“noon”等等就是回文串。但是这里,加入了空格和非字母数字的字符,增加了些难度,但其实原理还是很简单:只需要建立两个指针,left和right, 分别从字符的开头和结尾处开始遍历整个字符串,如果遇到非字母数字的字符就跳过,继续往下找,直到找到下一个字母数字或者结束遍历,如果遇到大写字母,就将其转为小写。等左右指针都找到字母数字时,比较这两个字符,若相等,则继续比较下面两个分别找到的字母数字,若不相等,直接返回false,时间复杂度为O(n)。

    C++解法一:

     1 class Solution {
     2 public:
     3     bool isPalindrome(string s) {
     4         int left = 0, right = s.size() - 1 ;
     5         while (left < right) {
     6             if (!isAlphaNum(s[left])) ++left;
     7             else if (!isAlphaNum(s[right])) --right;
     8             else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32) return false;
     9             else {
    10                 ++left; --right;
    11             }
    12         }
    13         return true;
    14     }
    15     bool isAlphaNum(char &ch) {
    16         if (ch >= 'a' && ch <= 'z') return true;
    17         if (ch >= 'A' && ch <= 'Z') return true;
    18         if (ch >= '0' && ch <= '9') return true;
    19         return false;
    20     }
    21 };

    我们也可以用系统自带的判断是否是数母字符的判断函数isalnum。

    C++解法二:

     1 class Solution {
     2 public:
     3     bool isPalindrome(string s) {
     4         int left = 0, right = s.size() - 1 ;
     5         while (left < right) {
     6             if (!isalnum(s[left])) ++left;
     7             else if (!isalnum(s[right])) --right;
     8             else if ((s[left] + 32 - 'a') %32 != (s[right] + 32 - 'a') % 32) return false;
     9             else {
    10                 ++left; --right;
    11             }
    12         }
    13         return true;
    14     }
    15 };

    对于该问题的扩展,还有利用Manacher算法来求解最长回文字符串问题,参见http://www.cnblogs.com/grandyang/p/4475985.html。

  • 相关阅读:
    chrome调试工具常用功能整理(转)
    js事件的相关收集
    键盘事件之keydown keypress keyup区别
    性能监控系统的搭建(转)
    关于浏览器并发请求数的研究及优化
    http头部信息研究
    什么是HTTP Keep-Alive呢?
    JavaScript跨域深入研究与解决办法(转)
    LRU Cache
    字节对齐&&sizeof
  • 原文地址:https://www.cnblogs.com/ariel-dreamland/p/9166245.html
Copyright © 2011-2022 走看看