题目介绍
思路
本题属于简单类型,思路也不是很复杂,运用双指针,一个指向字符串的头部,一个指向尾部,若两只指针的元素相等,则各自向中间移动一步,若不等则需要考虑两种情况:移动左指针,继续判断剩下的字符串是否为回文字符串,移动右指针判断是否为回文字符串。记录本题的主要原因在于代码的优化上,所以本文重点介绍如何进行代码的优化。
优化前的代码
bool isPalindrome(char* s, int start, int end)
{
while(start < end)
{
if(s[start] == s[end]){
start++;
end--;
}
else return false;
}
return true;
}
bool validPalindrome(char * s){
int start = 0, end = strlen(s) - 1;
while(start < end)
{
if(s[start] == s[end]){
start++;
end--;
}
else if(isPalindrome(s, start+1, end) || isPalindrome(s, start, end-1)) return true;
else return false;
}
return true;
}
优化前的代码显得很冗长,仔细思考后发现有许多值得优化的地方
代码优化
先来看函数isPalindrom内部的优化
while(start < end)
{
if(s[start] == s[end]){
start++;
end--;
}
else return false;
}
最开始的优化思路就是把while改写成for循环,然后根据退出循环的条件确定返回值
for( ; start < end && s[start] == s[end]; start++, end--);
if(start < end) return false;
return true;
仔细观察发现返回条件还可以进一步优化
for( ; start < end && s[start] == s[end]; start++, end--);
return start >= end;
按照同样的思路,优化主程序
int start = 0, end = strlen(s) - 1;
for( ; start < end && s[start] == s[end]; start++, end--);
return isPalindrome(s, start+1, end) || isPalindrome(s, start, end-1);
最终的代码如下:
bool isPalindrome(char* s, int start, int end)
{
for( ; start < end && s[start] == s[end]; start++, end--);
return start >= end;
}
bool validPalindrome(char * s){
int start = 0, end = strlen(s) - 1;
for( ; start < end && s[start] == s[end]; start++, end--);
return isPalindrome(s, start+1, end) || isPalindrome(s, start, end-1);
}
时间复杂度和空间复杂度
时间复杂度为O(N),空间复杂度为O(1);
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。