第一道
题目名称: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,两者相等,明显原数是回文数。
本文解析了两道关于回文串的算法题,包括中等难度的最长回文子串问题及简单级别的判断整数是否为回文数问题。通过中心扩散法解决最长回文子串问题,并采用整数反转法来判断回文数。
738

被折叠的 条评论
为什么被折叠?



