[每日算法 - 华为机试] leetcode680. 验证回文串 II

入口

力扣icon-default.png?t=N6B9https://leetcode.cn/problems/valid-palindrome-ii/submissions/

题目描述

给你一个字符串 s,最多 可以从中删除一个字符。

请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。

示例 1:

        输入:s = "aba"
        输出:true
示例 2:

        输入:s = "abca"
        输出:true
        解释:你可以删除字符 'c' 。
示例 3:

        输入:s = "abc"
        输出:false

提示:

        1 <= s.length <= 105
        s 由小写英文字母组成

方法一:贪心

解题思路 

回文字符串定义:"正读和反读都一样,中心对称的字符串"。贪心思想的最优子结构:贪心字符串边缘两个位置的字符串相同与否,相同可以继续运算,不同则非回文字符串。

 

Java示例

class Solution {
    public boolean validPalindrome(String s) {
        int low =0,heigh = s.length() - 1;
         while(low<heigh){
             char c1 = s.charAt(low);
             char c2 = s.charAt(heigh);
             if(c1==c2) {   
                ++low;
                --heigh;
             }else{
                 return validPalindrome(s,low+1,heigh) || validPalindrome(s,low,heigh-1);
             }
         }
         return true;
    }
     public boolean validPalindrome(String s,int low,int heigh) {
         while(low<heigh){
             char c1 = s.charAt(low);
             char c2 = s.charAt(heigh);
             if(c1!=c2) { return false; }else{
                 ++low;--heigh;
             }
         }
         return true;
    }

}

复杂度分析

时间复杂度:O(n)
空间复杂度:O(1)

posted @ 2023-07-21 11:39  yihuiComeOn  阅读(20)  评论(0)    收藏  举报  来源