第六周LeetCode算法题两道

第一道

题目名称:5. Longest Palindromic Substring

题目难度:Medium

题目描述:Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example:

Input: "cbbd"
Output: "bb"

题目思路:
找一个中心点,向两边扩散。如果即将扩散的两边的值相等,则继续扩散,否则,以当前中心点开始扩散的回文数的寻找宣告结束。
注意回文数的中点可能有两种情况,一种是回文数的长度为奇数,这种情况下中点只有一个,不影响回文性质。另一种情况是回文数的长度为偶数,这种情况下我们认为中点是由两个相同的字符组成的。
具体的代码如下:

class Solution {
public:
    string getNextOne(string s, int low, int high) {
        while (low >= 0 && high < s.size() && s[low] == s[high]) {
            low--;
            high++;
        }
        string sub = s.substr(low+1, high - low - 1);
        return sub;
    }

    string longestPalindrome(string s) {
        string longest = "";
        for (int i = 0; i < s.size(); ++i) {
            string nextStr = getNextOne(s, i, i);
            if (nextStr.size() > longest.size())
                longest = nextStr;
            nextStr = getNextOne(s, i, i + 1);
            if (nextStr.size() > longest.size())
                longest = nextStr;
        }
        return longest;
    }
};

第二道

题目名称:9. Palindrome Number

题目难度:Easy

题目描述:Determine whether an integer is a palindrome. Do this without extra space.

题目分析:
觉得本题出得特别不合理,一开始被题目中的要求“without extra space“限制得死死的,想不出合理的办法。后来想着利用几个int整型试试看能不能过。试了一下,结果是AC,于是有的下面的代码。

class Solution {
public:
    bool isPalindrome(int x) {
        if (x == 0) {
            return true;
        } else if (x < 0 || x % 10 == 0) {
            return false;
        } 
        int test = 0, temp;
        while (x > test) {
            test = test * 10 + (x % 10);
            temp = x;
            x /= 10;
        }
        if (x == test || temp == test)
            return true;
        else
            return false;
    }
};

基本的思路是将这个数的后一半的数字给取出来,然后按照反序加成一个数,将之与原数操作后形成的数相比较,若一样,则是回文数。
比如:1221,将后半段取出来,反序,得:12,原数被操作后形成的数:12,两者相等,明显原数是回文数。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值