leetcode-680-Valid Palindrome II
阿新 • • 發佈:2018-05-12
note 我們 關於 nat contain TP eat tco ++
題目描述:
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:
- 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。
leetcode-680-Valid Palindrome II