leetcode-680-Valid Palindrome II

题目描述:

Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome.

Example 1:

Input: "aba"
Output: True

 

Example 2:

Input: "abca"
Output: True
Explanation: You could delete the character 'c'.

 

Note:

  1. The string will only contain lowercase characters a-z. The maximum length of the string is 50000.

 

要完成的函数:

bool validPalindrome(string s) 

说明:

1、给定一个字符串,至多删去里面的一个字符,使其成为一个回文串。判断能不能实现。

2、我们先看一个例子

abca

acba(反转)

我们可以看到第一个字母是一样的,第二个字母的时候就对不上了,那我们如果要形成一个回文串,可以试着删去第二个字母b,也可以删去从后面数起第二个字母c,只要之后能一一对上,那么还是一个回文串。

关于这两种情况,给两个例子来说明一下:

ececabbacec,这个字符串,我们看到第一个字符e和最后一个字符c没对上,我们可以删去e,这样子能形成回文串。我们也能删去c,但这样形成不了回文串。这是要删去前面字符的例子。

abbca,这个字符串,如果删去前面字符b,那么形成不了回文串,如果删去后面字符c,刚好能形成回文串。这是要删去后面字符的例子。

所以我们要分成两种情况来判断处理。

按照上述逻辑来处理一下,构造如下代码:(附解释)

    bool validPalindrome(string s) 
    {
        int i=0,j=s.size()-1;
        while(i<j)
        {
            if(s[i]!=s[j])//当碰到对不上的时候,记录i和j的值
                break;
            i++;
            j--; 
        }
        int i1=i,j1=j;//记录一个副本
        i++;//如果删去前面的字符,i++,处理下一个
        bool flag=1;
        while(i<j)
        {
            if(s[i]!=s[j])//如果出现第二次对不上的情况
            {
                flag=0;
                break;
            }
            i++;
            j--;
        }
        if(flag==1)//如果全程都对得上,那么返回true
            return true;
        j1--;//如果删去前面的字符对不上了,那么删去后面的字符试试
        while(i1<j1)
        {
            if(s[i1]!=s[j1])//如果还是对不上,返回false
                return false;
            i1++;
            j1--;
        }
        return true;//如果全程对得上,那么返回true
    }

上述代码实测119ms,beats 90.33% of cpp submissions。

原文地址:https://www.cnblogs.com/chenjx85/p/9026644.html