题目:
官方答案(C++):
class Solution {
private:
int expandAroundCenter(string s, int left, int right)
{
while (left >= 0 && right < s.size() && s[left] == s[right])
{
left--;
right++;
}
return right - left - 1;
}
public:
string longestPalindrome(string s) {
int size = s.size();
if (size < 1) return "";
int start = 0, end = 0;
for (int i = 0; i < size; i++)
{
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = max(len1, len2);
if (len > end - start +1)
{
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substr(start, end-start+1);
}
};
结果:
我也是醉了…这官方答案
网上见过的最好的答案:
class Solution {
public:
string longestPalindrome(string s) {
int n=s.length();
int i=0,start=0,end=0,tmp_len=0,max_len=1,pos=0;
while(i<n)
{
start=i;end=i;
//跳过重复的字符串
while(end<n-1 && s[end+1] == s[end])
{
++end;
}
i=end+1;
//两边扩展
while(start > 0 && end < n-1 && s[start-1]==s[end+1])
{
--start;++end;
}
tmp_len=end-start+1;
if(tmp_len > max_len)
{
max_len=tmp_len;
pos=start;
}
}
return s.substr(pos,max_len);
}
};
补充知识
从字符串中提取字符串的函数substr()
原型:
basic_string substr(const size_type _Off = 0, const size_type _Count = npos) const
//npos代表最好一个字符
例子:
#include<string>
#include<iostream>
using namespace std;
void main()
{
string s("12345asdf");
string a=s.substr(0,5);
cout<<a<<endl;
}