LeetCode 125 Valid Palindrome

LeetCode 125

Valid Palindrome

  • Problem Description:
    判断给出的字符串是否是有效的回文字符串。

    具体的题目信息:
    https://leetcode.com/problems/valid-palindrome/description/

  • Solution:

    • 解题思路:用两个变量ij从字符串两端向中间移动,比较两个变量指向的字符
      (1)如果两个变量指向的字符都是字母,必须是同个字母或者同个字母的大小写
      (2)如果两个变量指向的字符都是数字,必须是同个数字
      (3)如果两个变量指向的字符是不同类型的,必须保证不能一个指向字母,一个指向数字,正确的情况如下:
      • 一个指向字母,一个必须指向标点符号或者空格
      • 一个指向数字,一个必须指向标点符号或者空格
    • 编程实现:
class Solution {
public:
    bool isPalindrome(string s) {
        if (s == "") return true;
        int i = 0, j = s.size()-1;
        while(i <= j) {
            //若对应位置的字符都是字母,必须是同个字母的大小写才返回true,否则返回false
            if (isCharacter(s[i])&&isCharacter(s[j])) {
                if (s[i]+32 == s[j]||s[i]-32 == s[j]||s[i] == s[j]) {
                    i++;
                    j--;
                } else {
                    return false;
                }
            } else if (isNumber(s[i])&&isNumber(s[j])) {
                //若对应位置的字符都是数字,必须是同个数字才返回true,否则返回false
                if (s[i] == s[j]) {
                    i++;
                    j--;
                } else {
                    return false;
                }
            } else {
                //若字符既不是字母也不是数字,前进(后退)一位
                if (!isCharacter(s[i])&&!isNumber(s[i])) {
                    i++;
                } else if (!isCharacter(s[j])&&!isNumber(s[j])) {
                    j--;
                } else if (isCharacter(s[i])) {
                    //若对应位置的两个字符一个是数字,一个是字母,返回true,否则将不是数字或字母的位置向前(后)移动一位
                    if (isNumber(s[j])) {
                        return false;
                    }
                    j--;
                } else if (isCharacter(s[j])) {
                    if (isNumber(s[i])) {
                        return false;
                    }
                    i++;
                }
            }
        }
        return true;
    }
    //判断字符是否字母
    bool isCharacter(char i) {
        if ((i>='a'&&i<='z')||(i>='A'&&i<='Z'))
            return true;
        return false;
    }
    //判断字符是否数字
    bool isNumber(char i) {
        if (i>='0'&&i<='9')
            return true;
        return false;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值