题目介绍

leetcode680

思路

本题属于简单类型,思路也不是很复杂,运用双指针,一个指向字符串的头部,一个指向尾部,若两只指针的元素相等,则各自向中间移动一步,若不等则需要考虑两种情况:移动左指针,继续判断剩下的字符串是否为回文字符串,移动右指针判断是否为回文字符串。记录本题的主要原因在于代码的优化上,所以本文重点介绍如何进行代码的优化。

优化前的代码

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);


宋树鹏
1 声望0 粉丝