验证回文串(数字+大小写字母)

1.题目描述:

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

2.主要思想

我们可通过类比快速排序的方法,用前[begin]和后[end]两个下标控制,分别从两头跳过空格一直找到数字或者字母停止,二者进行比较,如果二者不同则返回false,如果二者相同则继续寻找再比较,直到所有的字母或者数字都比较完就结束。
难点: 由于要比较的字符既有数字又有字母,而计算机里只存字符的ASCII码值,所以比较字符是否相等是我们的首要任务。
方法 一: 直接用找到的字符判断begin和end位置的字符是否相等(忽略字母的大小写)
因为(a+32)%32与(A+32)%32的值相等,所以我们可以用下面的条件判断:

if(begin<end)
{
     if ((s[begin]+32-'a')%32!=(s[end]+32-'a')%32))
         return false;
 ++begin;
 --end;
 }        

方法二: 若找到的字符是大写字母则转换为小写字母,再直接对二者的比较。即:

//if(c>='A'&&c<='Z')
//c+=32;

  if(begin<end)
    {
         if (s[begin]!=s[end])
             return false;
     ++begin;
     --end;
     }       
完整代码:
class Solution {
public:
    bool isPalindrome(string s) {
        if(s.empty()!=0)
            return true;
        int begin=0;
        int end=s.size()-1;
        char* p=(char*)s.c_str();
        while(begin<=end)
        {
            while(begin<end)
            {
                if(IsNumber(s[begin]))
                    break;
                 ++begin;
            }
            while(begin<end)
            {
                if(IsNumber(s[end]))
                   break;
                 --end;
            }
            if(begin<=end)
            {
                if(s[begin]!=s[end])
                  //if((s[begin]+32-'a')%32!=(s[end]+32-'a')%32)
                    return false;
                    begin++;
                    end--;
            }
        }
         return true;
    }
    
    bool IsNumber(char& c)
    {
        if(c>='A'&&c<='Z')
        c+=32;
        if(c>='0'&&c<='9'|| c>='a'&&c<='z')
        {
            return true;            
        }
     return false;
    }
         //    bool IsNumber(char c)
        //{
       //     if(c>='0'&&c<='9'||
      //      c>='a'&&c<='z'||
      //      c>='A'&&c<='Z')
     //    {
     //        return true;            
     //    }
    //  return false;
    // }
    };

猜你喜欢

转载自blog.csdn.net/ly_6699/article/details/86706216