leetcode 125 Valid Palindrome

  讲道理,连着做了两个palindrome的题目,挺崩溃的。上一个题目是9题,求整数是否是palindrome,但是没有说不算负数。。。所以第一次提交的时候,还对负数进行了取绝对值之后的判断。同样,在这道题目中,求string是否是Palindrome,开始每一次提交都会有错,原因是没有考虑字符串中存在数字的情况。不知道是题目表述的不清楚,还是自己脑回路清奇。
  啰嗦了这么多,下面进入正题。

1. 题目分析

  题目描述:Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,
“A man, a plan, a canal: Panama” is a palindrome.
“race a car” is not a palindrome.

Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.

For the purpose of this problem, we define empty string as valid palindrome.
  题目含义:不多赘述,就是判断一个string是否是Palindrome,还给举例证明了。人性化的是,在Note中题目指出了将空串定义为有效的Palindrome。
  题目分析:思路比较简单。就是首先对string进行提纯处理,去掉标点符号;然后将预处理后的string中的字母转换成同一形式,均大写或者均小写;然后使用二分法的方式一次对首尾进行对称判断。这道题目比9题容易的地方在于,string可以用指针,不需要对string进行截断处理。

2.题目解答–cpp

class Solution {
public:
    bool isPalindrome(string s) {
        // 定义一个新串,用于存储格式化后的s
        string newstr;
        // exceptional case
        if (s.size() == 0) {
            return true;
        }

        // erase the punctuation and all upper to lower
        for (int i = 0; i < s.size(); i++) {
            int val = int(s[i]);
            if (val >= 65 && val <= 90) {
                newstr += s[i];
            }
            else if (val >= 97 && val <= 122) {
                newstr += (s[i]-32);
            }
            else if (val >= 48 && val <= 57) {
                newstr += s[i];
            }
        }

        // judge true or not
        int len = newstr.size();
        int front = 0;
        int end = len - 1;
        while(front < end) {
            if (newstr[front] == newstr[end]) {
                front++;
                end--;
            }
            else {
                return false;
            }
        }
        return true;
    }
};

3. 心得体会

  string中可以直接使用toupper()和tolower()方法进行大小写的转换。一开始还自己通过asii进行转换,有点蠢。
  编程是个细心活儿,需要考虑到各种可能出现的情况,并且要对细节考虑的十分仔细。虽然很简单,但是还是在文章开始处提到的问题浪费了很多调试时间。。学艺不精。。我自己的代码往往都特别长,后期需要提高代码的效率和空间利用率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值