letcode刷题的第4题,对于解题的思路不做过多研究,主要用于比较一种思路情况下代码实现技巧。
以下代码根据中心
1.自己实现的代码
std::string CheckString(std::string s){
std::string longstr="";
std::string tstr="";
for(int i=0; i<s.size();i++){
tstr= this->GetPalindromicString(s, i, i);
if(longstr.size()<tstr.size()){
longstr=tstr;
}
tstr= this->GetPalindromicString(s, i, i + 1);
if(longstr.size()<tstr.size()){
longstr=tstr;
}
}
return longstr;
}
std::string GetPalindromicString(std::string s, int beg, int end){
int i = beg, j = end, len = int(s.size());
if(i<0 || j>=len){
return "";
}
if(s[i] != s[j]){
return s.substr(i, 1);
}
while(s[i] == s[j]){
if(i==0 || j == len-1){
return s.substr(i, j-i+1);
}
i--;
j++;
}
return s.substr(i+1,j-i-1);
}
代码实现没有问题,但是if,while条件多,理解起来会稍微困难
2.网上实现版本1
string findLongestPalindrome(string &s)
{
const int length=s.size();
int maxlength=0;
int start;
for(int i=0;i<length;i++)//长度为奇数
{
int j=i-1,k=i+1;
while(j>=0&&k<length&&s.at(j)==s.at(k))
{
if(k-j+1>maxlength)
{
maxlength=k-j+1;
start=j;
}
j--;
k++;
}
}
for(int i=0;i<length;i++)//长度为偶数
{
int j=i,k=i+1;
while(j>=0&&k<length&&s.at(j)==s.at(k))
{
if(k-j+1>maxlength)
{
maxlength=k-j+1;
start=j;
}
j--;
k++;
}
}
if(maxlength>0)
return s.substr(start,maxlength);
return NULL;
}
代码实现简洁,与自己实现代码区别是:在从中心往外扩散的过程中,满足条件就与当前的最大maxlength比较。
存在的问题就是耗时会长一点。
3.网上实现代码2
public String longestPalindrome(String s) {
int start = 0, end = 0;
for (int i = 0; i < s.length(); i++) {
int len1 = expandAroundCenter(s, i, i);
int len2 = expandAroundCenter(s, i, i + 1);
int len = Math.max(len1, len2);
if (len > end - start) {
start = i - (len - 1) / 2;
end = i + len / 2;
}
}
return s.substring(start, end + 1);
}
private int expandAroundCenter(String s, int left, int right) {
int L = left, R = right;
while (L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)) {
L--;
R++;
}
return R - L - 1;
}
代码实现简洁,但是理解稍微麻烦点,例如expandAroundCenter("ab",0,0)返回1,而对于expandAroundCenter("ab",0,1)返回0,需要根据case理解消化。
个人总结:首先尝试用最好理解的方式写代码,正向与方向都要思考,先写出简洁的,容易理解的代码,如2。
尝试返回不同类型的值,返回字符串或者长度,看下有什么不同。
2016.11.22 12:10