题目描述:
给你一个整数 x
,如果 x
是一个回文整数,返回 true
;否则,返回 false
。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121
是回文,而 123
不是。
示例 1:
1 | 输入:x = 121 |
示例 2:
1 | 输入:x = -121 |
示例 3:
1 | 输入:x = 10 |
示例 4:
1 | 输入:x = -101 |
解法:
对于回文数或者说是回文字符串,可以理解成一个字符串正着都和反着读结果是一样的。
例如:abcba
,正着读结果是:a->b->c->b->a,反着读结果是:a<-b<-c<-b<-a,他们的结果是一样的。
例如:上海自来水来自海上
也是一个回文字符串。
首先把字符串转换成一个字符数组,然后可以利用头尾依次比较的思想,分别指向头和尾的元素,判断他们是否相等。
1 | /** |
在了解了回文字符串之后,来看下面一道题,求一个字符串的最长回文子串。
题目描述
给你一个字符串 s
,找到 s
中最长的回文子串。
示例 1:
1 | 输入:s = "babad" |
示例 2:
1 | 输入:s = "cbbd" |
示例 3:
1 | 输入:s = "a" |
示例 4:
1 | 输入:s = "ac" |
解法:
首先,对于子串的定义我们需要明白它的涵义是:字符串中一段连续的子字符串,例如字符串abcde
中,其中abc
是其子串,abcd
也是,而ac
或者bd
就不是,因为他们不连续。
同时,通过上一题的思路,我们可以很容易得到一种暴力的解法,即枚举求出改字符串的所有子串,然后分别判断他们是否是回文串,同时记录长度,取最大长度的结果,我们可以得到如下解法:
1 | /** |
上面解法可以通过,但是效率很低,通过观察回文串的特点我们可以知道,对于一个子串而言,如果它是回文串,并且长度大于2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串ababa
,如果我们已经知道 bab
是回文串,那么ababa
一定是回文串,这是因为它的首尾两个字母都是a
。
创建一个动态规划数组dp[]
:
dp[i][j]
表示字符串s[i]
到s[j]
之间的是否为回文串。- 并且如果
s[i] == s[j]
,则dp[i][j]
==dp[i+1][j-1]
,即如果首位元素相同,那么去掉首位元素后,仍然是回文串。 - 每次更新完
dp[i][j]
之后,更新并记录最大值。
代码如下:
1 | var longestPalindrome = function(s) { |