leetcode680(验证回文字符串II)--C语言实现

馋奶兔 提交于 2020-08-08 05:49:50

求:

给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

示例 1:

输入: "aba"
输出: True
示例 2:

输入: "abca"
输出: True
解释: 你可以删除c字符。
注意:

字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。

 

解:

思路:这是判断是否是回文字符串的变式。通过分析可以得到,符合题目要求的情况包括:

1、字符串本身就是一个回文字符串

2、字符串不是回文字符串,根据题目定义,一定是回文字符串中掺入了一个字符,导致不是回文,如果字符出现在前面,举例如asbcba。或者字符出现在后面,举例如abcbsa,不管是哪种,剩余的字符串bcb都是回文字符串。因此我们保留回文判定函数,当第一次在源字符串中出现字符判定不相等时,传入子串的起止位置,判定剩下的子串是否是回文字符串即可。

bool  isPalindrome( char  * s, int  start, int  end){
     while (start<end && s[start]==s[end]){
        ++start;
        --end;
    }
     return  start>=end;
}
 
bool  validPalindrome( char  * s){
     int  i,j;
     for (i= 0 ,j=strlen(s)- 1 ;i<j;){
         if (s[i]==s[j]){
            ++i;
            --j;
        } else {
             return  isPalindrome(s,i+ 1 ,j)||isPalindrome(s,i,j- 1 );
        }
    }
     return  i>=j;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!