当前位置: 首页 > article >正文

【Leetcode刷题记录】680. 验证回文串 II

680. 验证回文串 II

给你一个字符串 s,最多 可以从中删除一个字符。
请你判断 s 是否能成为回文字符串:如果能,返回 true ;否则,返回 false 。

这道题最直观的方法是先判断字符串s是不是回文,如果是直接返回true,如果不是,那么枚举每一个被删除的位置,
判断删除字符后是否是回文,如果是返回true,否则返回false。这种方法的时间复杂度是 O ( n 2 ) O(n^2) O(n2)


    // 辅助函数:判断字符串是否是回文
    bool isPalindrome(const string& s) {
        int left = 0;
        int right = s.length() - 1;
        while (left < right) {
            if (s[left] != s[right]) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
 bool validPalindrome(string s) {
        // 先判断是否已经是回文
        if (isPalindrome(s)) {
            return true;
        }
        // 枚举删除每一个字符
        for (int i = 0; i < s.length(); i++) {
            string temp = s;
            temp.erase(i, 1); // 删除第 i 个字符
            if (isPalindrome(temp)) {
                return true;
            }
        }
        return false;
    }

判断字符串是否是回文我们可以使用双指针的方法来求解,定义左右指针leftright来求解,如果 s [ l e f t ] = = s [ r i g h t ] s[left] == s[right] s[left]==s[right],那么 l e f t + + , r i g h t − − left++,right-- left++right,否则返回false。这种方法的时间复杂度是 O ( n ) O(n) O(n)。那么针对这道题,采用双指针解法,当 s [ l e f t ] ! = s [ r i g h t ] s[left]!=s[right] s[left]!=s[right]时,两个指针所指的字符必须有一个要删除,我们分别判断删除左指针指向的字符后留下的子串 s [ l e f t + 1 : r i g h t ] s[left+1:right] s[left+1:right]和删除右指针指向的字符留下的子串 s [ l e f t : r i g h t − 1 ] s[left:right-1] s[left:right1]是否是回文,如果有一个是返回true,否则返回false

// 辅助函数:判断字符串是否是回文
bool check(const string& s, int left, int right) {
        while (left < right) {
            if (s[left] != s[right]) {
                return false;
            } else {
                left++;
                right--;
            }
        }
        return true;
    }
    bool validPalindrome(string s) {
        int l = 0, r = s.size() - 1;
        while (l < r) {
            if (s[l] == s[r]) {
                l++;
                r--;

            } else {
                return check(s,l,r-1)||check(s,l+1,r);
            }
        }
        return true;
    }

http://www.kler.cn/a/531698.html

相关文章:

  • UI线程用到COM只能选单线程模型
  • Kamailio 不通过 dmq 实现注册复制功能
  • Deep Sleep 96小时:一场没有硝烟的科技保卫战
  • TypeScript (TS) 和 JavaScript (JS)
  • 第 1 天:UE5 C++ 开发环境搭建,全流程指南
  • C# 结构体介绍
  • 解决对axios请求返回对象进行json化时报“TypeError Converting circular structure to JSON“错误的问题
  • 直方图:摄影中的视觉数据指南
  • ANSYS Mechanical APDL打开cdb文件
  • AUTOSAR从入门到精通-【新能源汽车】高压配电管理(PDU/BDU)(二)
  • 使用scikit-learn中的K均值包进行聚类分析
  • 【最长上升子序列Ⅱ——树状数组,二分+DP,纯DP】
  • [论文学习]Adaptively Perturbed Mirror Descent for Learning in Games
  • PyTorch生态系统中的连续深度学习:使用Torchdyn实现连续时间神经网络
  • FPGA|IP核PLL调用测试:建立工程
  • 【前端知识】常用CSS样式举例
  • Android开发工作经历整理
  • Vuex状态管理
  • 【漫话机器学习系列】078.如何选择隐藏单元激活函数(How To Choose Hidden Unit Activation Functions)
  • MySQL与Python交互-08
  • Java | CompletableFuture详解
  • 网站快速收录:如何优化网站音频内容?
  • bypass hcaptcha、hcaptcha逆向
  • 基于深度学习的视觉检测小项目(十七) 用户管理后台的编程
  • 如何确认Linux嵌入式系统的触摸屏对应的是哪个设备文件(/dev/input/event1)?如何查看系统中所有的输入设备?输入设备的设备文件有什么特点?
  • Linux进阶——例行性工作