每日一刷题之回文数和回文字符串

本文介绍了如何判断一个整数是否为回文数,并探讨了寻找最长回文子串的算法。提供了两种问题的具体实现代码,包括双指针验证回文数及中心扩展法求最长回文子串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

回文数题目

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:
输入:x = 121
输出:true

示例 2:
输入:x = -121
输出:false
解释:从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

示例 3:
输入:x = 10
输出:false
解释:从右向左读, 为 01 。因此它不是一个回文数。

链接:
https://leetcode.cn/problems/palindrome-number/description/

解题思路

这道题我再做时我的思路是如何做到让它从前到后都要一样,我的第一想法就是把数字拆分到数组里面,然后利用双下标的方法让它能够最后一个数字和第一个相同,倒数第二个与第二个相同知道匹配结束就能知道它是否是一个回文数。

代码

下面直接上代码:

class Solution {
public:
    bool isPalindrome(int x) {
    if(x<0){//负数直接排除
    return false;
    }
    if(x<=9){//小于10也直接排除
        return true;
    }
    int tem=x;//临时变量保存x
    int count=0;//创建计数器
      while (tem != 0) {//得出计算几次
        tem /= 10;
        count++;
    }
    tem = x;//继续用tem保存x
    int arr[10000];//因为力扣好像不支持定义arr[count]就随便定义一个长度数组
    for (int i = 0; i < count; i++) {
        arr[i] = tem % 10;
        tem /= 10;
}
int j=count-1;
int i=0;
int flag=0;//创一个标记看它是否相同
while(i<j){
    if(arr[i]!=arr[j]){//若出现不同直接false
        flag=0;
        return flag;
    }
    else{
        flag=1;//若成功则返回true
    }
    i++;
    j--;
}
return flag;
    }
};

通过截图:
在这里插入图片描述

回文字符串题目

给你一个字符串 s,找到 s 中最长的回文子串。

示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。

示例 2:
输入:s = “cbbd”
输出:“bb”

解题思路

这道题要比回文数要难,方法有很多可以动态规划,也可以由中点扩散,而我觉得中点往两边走比较简单就用的中间往2边走的方法,要想截取最长的回文子串那么从中间往2边走会出现2种情况,就是中点是哪个,要么是偶数的子串要么是奇数的子串,我的方法是设置2个坐标往2边出发,偶数子串左边坐标是i,右边就是i+1,奇数子串则左右坐标相同。

代码

下面直接上代码:

class Solution {
public:
    int max=0;
    int left=0;
    int right=0;
    string longestPalindrome(string s) {
    //回文字符串就是从后往前还是从前往后看一致
    for(int i=0;i<s.size();i++){
        fun(s,i,i,s.size());//奇数情况
        fun(s,i,i+1,s.size());//偶数情况
    }
    return s.substr(left,max);
    //截取长度从左边坐标开始到满足回文子串的坐标
    }
    void fun(const string&s,int i,int j,int n){
while(i>=0&&j<n&&s[i]==s[j]){
    if(j-i+1>max){
        left=i;
        right=j;
        max=j-i+1;
    }
    i--;
    j++;
}
    }
};

通过截图:

在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值