zoukankan      html  css  js  c++  java
  • 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放在前面实现一个判断,不然后续判断就没有效果。

     

  • 相关阅读:
    css 权威指南笔记
    angular directive restrict 的用法
    vim 的寄存器
    以普通用户启动的Vim如何保存需要root权限的文件
    jshint options
    如何在Ubuntu Linux上安装Oracle Java
    Linux:使用nohup让进程在后台可靠运行
    反射-----学习Spring必学的Java基础知识之一
    java异常捕获
    cookie
  • 原文地址:https://www.cnblogs.com/xlqtlhx/p/7749903.html
Copyright © 2011-2022 走看看