zoukankan      html  css  js  c++  java
  • 【LeetCode-字符串】验证回文字符串 Ⅱ

    题目描述

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

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

    注意:

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

    题目链接: https://leetcode-cn.com/problems/valid-palindrome-ii/

    思路1

    首先判断原字符串是否是回文串,如果不是的话,每次删除一个字符后判断字符串是否是回文串。判断一个字符串是否是回文串的方法是:

    • 设置两个指针 left=0, right=s.length()-1;
    • 如果 left<=right,循环:
      • 如果 s[left]!=s[right], return false;
      • left++; right--;
    • return true;

    代码如下:

    class Solution {
    public:
        bool validPalindrome(string s) {
            if(s.empty()) return true;
            if(isOk(s)) return true;
    
            int n = s.length();
            for(int i=0; i<n; i++){
                string temp = s;
                temp.erase(i, 1);
                if(isOk(temp)) return true;
            }
            return false;
        }
    
        bool isOk(string s){
            int left = 0;
            int right = s.length()-1;
            while(left<=right){
                if(s[left]!=s[right]) return false;
                left++;
                right--;
            }
            return true;
        }
    };
    // 超时
    
    • 时间复杂度:O(n^2)
    • 空间复杂度:O(n)

    思路2

    对思路 1 进行改进,首先设置两个指针 left=0,right=s.length()-1。将两个指针由两边向中间靠拢,如果 s[left]!=s[right],那么我们判断 s[left,...,right-1] 或者 s[left+1,...,right] 是否是回文串,如果这两个字符串有一个是回文串,则原字符串 s 就是回文串,否则 s 不是回文串。例如,s="bcaab",则c!=a,所以两个字符串分别是 caaa,因为 aa 是回文串,所以 s 也是回文串(去掉c)。代码如下:

    class Solution {
    public:
        bool validPalindrome(string s) {
            if(s.empty()) return true;
            if(isOk(s)) return true;
    
            int n = s.length();
            int left = 0, right = n-1;
            while(left<=right){
                if(s[left]!=s[right]){
                    int strLen = right-left;
                    /*string temp = s.substr(left, strLen+1);;
                    string temp1 = temp, temp2 = temp;
                    temp1 = temp1.erase(0, 1);
                    temp2.pop_back();*/
                    string temp1 = s.substr(left, strLen); // 不包含 left
                    string temp2 = s.substr(left+1, strLen); // 不包含 right
                    if(isOk(temp1) || isOk(temp2)) return true;
                    else return false;
                }
                left++;
                right--;
            }
            return false;
        }
    
        /*判断 s 是否是回文串,是返回 true,否返回 false*/
        bool isOk(string s){
            int left = 0;
            int right = s.length()-1;
            while(left<=right){
                if(s[left]!=s[right]) return false;
                left++;
                right--;
            }
            return true;
        }
    };
    
    • 时间复杂度:O(n)
    • 空间复杂度:O(1)
  • 相关阅读:
    导入GooglePlay Services出现的一个错误
    在Linux下后台运行jar包文件
    android7.0闪退问题java.lang.SecurityException: MODE_WORLD_READABLE no longer supported
    从手机中扫描以com.xx.xxx 为前缀的apk包,使用列表的形式展现
    AS运行项目出现Error while Launching activity的错误
    Android——解决引入jar包和arr包时support.v7包的冲突
    Java知识点小记
    异步解压ZIP文件
    WP手机升级WIN10被PIN码锁定
    EXCEL 跨表比较数据
  • 原文地址:https://www.cnblogs.com/flix/p/12916120.html
Copyright © 2011-2022 走看看