LeetCode--Valid PalindromeⅡ
- 正常解法
 
1 class Solution { 2 public: 3 bool reverse(string input) 4 { 5 string res=""; 6 for(int i=input.length()-1;i>=0;i--) 7 res+=input[i]; 8 if(res==input) 9 return true; 10 else 11 return false; 12 } 13 bool validPalindrome(string s) { 14 if(reverse(s)) 15 return true; 16 else 17 { 18 string copy; 19 string::iterator iter; 20 for(int i=0;i<s.length();i++) 21 { 22 copy=s; 23 iter=copy.begin(); 24 copy.erase(iter+i); 25 //cout<<copy<<endl; 26 if(reverse(copy)) 27 return true; 28 29 } 30 return false; 31 } 32 33 } 34 };
以上是正常解法,但认真分析可以发现其复杂度是O(n^2),原因很简单,首先先逐个查找去掉某一个字符的字符串是不是回文序列,查找需要n次,同时字符串与reverse后字符串的比较的次数也为n次,由此可见算法复杂度是n^2,这在leetcode上运行时会出现严重的超时,故采取第二种简单的做法,可以实现O(n)复杂度。
- 简单做法
 
class Solution {
public:
    bool validPalindrome(string s) {
    int i=0,j=s.length()-1;
    int track=0;
    int si,sj;
    while(i<j)
    {
        if(s[i]==s[j])
        {
            i++;
            j--;
            continue;
        }
        if(track==2)
        {
            return false;
        }   
        if(track==1)
        {
            track++;
            i=si;
            j=sj;
            j++;
        }  
        if(track==0)
        {
            track++;
            si=i;
            sj=j;
            i--;
        }
        i++;
        j--;
    }
    return true;   
    }
};
定义两个标志i,j,一个从左边出发,一个从右边出发,一起对比遍历,期间有两个选择,可以向前退也可以向后面退,但只能一步,而且在判断语句中,一定要把track==2放在前面实现一个判断,不然后续判断就没有效果。
                    
                
                
            
        
浙公网安备 33010602011771号