算法 系列博客

【算法】刷题范围建议 和 代码规范
【算法】复杂度理论 ( 时间复杂度 )

【字符串】最长回文子串 ( 蛮力算法 )
【字符串】最长回文子串 ( 中心线枚举算法 )
【字符串】最长回文子串 ( 动态规划算法 ) ★
【字符串】字符串查找 ( 蛮力算法 )
【字符串】字符串查找 ( Rabin-Karp 算法 )

【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )
【算法】双指针算法 ( 有效回文串 II )


文章目录

  • 算法 系列博客
  • 一、有效回文串 II

一、有效回文串 II


有效回文串 II : https://www.lintcode.com/problem/891/

给定非空字符串 , 最多删除一个字符 , 判断是否可以将该字符串变成回文串 ;

该算法是一个贪心算法 , 给定一个字符串 “abca” , 设置两个指针 , 分别指向最左侧字符 和 最右侧字符 , 从两端开始遍历 , 逐个比较两个指针指向的字符是否相等 ;

如果出现了左右指针指向的字符不相等 , 那么只能有两种操作 , 要么删除左指针指向的字符 , 要么删除右指针指向的字符 ;

删除左指针指向的字符 , 继续向后遍历 , 判定整个字符串是否是回文串 ;
删除右指针指向的字符 , 继续向后遍历 , 判定整个字符串是否是回文串 ;

如果上述两种方案 , 都不是回文串 , 那么说明删除单个字符后字符串仍不是回文串 ;

代码示例 :

class Solution {/*** 给一个非空字符串 s,你最多可以删除一个字符。判断是否可以把它变成回文串。* @param s 给定的字符串 * @return 删除零个或一个字符后是否是回文串*/public boolean validPalindrome(String s) {if (s == null) {return false;}// 先判定该字符串是否是回文串// 数组中 0 索引存放左指针, 1 索引存放右指针 int[] pointer = new int[2];findDifference(s, 0, s.length() - 1, pointer);if (pointer[0] >= pointer[1]) {return true;}// 如果字符串不是回文串, 则考虑删除左指针/右指针指向的字符, 再判定是否是字符串// 删除左指针指向的字符, 并验证是否是回文串return isPalindrome(s, pointer[0] + 1, pointer[1])// 删除右指针指向的字符, 并验证是否是回文串  || isPalindrome(s, pointer[0], pointer[1] - 1); }private void findDifference(String s, int left, int right, int[] result) {// 对比两字符是否相等, 如果相等, 指针向中间移动一位while (left < right && s.charAt(left) == s.charAt(right)) {left++;right--;}// 设置返回值// 如果该字符串是回文串, 则左指针最后等于 ( 偶数个字符 ) 或者大于右指针 ( 奇数个字符 )// 如果该字符串不是回文串 , 则左右指针原封不动返回result[0] = left;result[1] = right;}private boolean isPalindrome(String s, int left, int right) {// 判定 s 字符串是否是回文串int[] pointer = new int[2];findDifference(s, left, right, pointer);return pointer[0] >= pointer[1];}
}class Main {public static void main(String[] args) {System.out.println(new Solution().validPalindrome("abcnba"));}
}

【算法】双指针算法 ( 有效回文串 II )相关推荐

  1. 132. 分割回文串 II

    链接:132. 分割回文串 II 题解:https://leetcode-cn.com/problems/palindrome-partitioning-ii/solution/xiang-tong- ...

  2. Manacher's Algorithm 马拉车算法(最长回文串)

    这个马拉车算法Manacher's Algorithm是用来查找一个字符串的最长回文子串的线性方法,由一个叫Manacher的人在1975年发明的,这个方法的最大贡献是在于将时间复杂度提升到了线性,这 ...

  3. hdu 3068 最长回文 (Manacher算法求最长回文串)

    参考博客:Manacher算法--O(n)回文子串算法 - xuanflyer - 博客频道 - CSDN.NET 从队友那里听来的一个算法,O(N)求得每个中心延伸的回文长度.这个算法好像比较偏门, ...

  4. Manacher算法 - 求最长回文串的利器

    求最长回文串的利器 - Manacher算法 Manacher主要是用来求某个字符串的最长回文子串. 不要被manacher这个名字吓倒了,其实manacher算法很简单,也很容易理解,程序短,时间复 ...

  5. leetcode132. 分割回文串 II

    给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: 1 解释: 进行一次分割就可将 s 分割成 [ ...

  6. LeetCode 132. 分割回文串 II(DP)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回符合要求的最少分割次数. 示例: 输入: "aab" 输出: ...

  7. leetcode题解132-分割回文串 II

    问题描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文. 返回符合要求的 最少分割次数 . 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割 ...

  8. 【数据结构与算法】之深入解析“分割回文串II”的求解思路与算法示例

    一.题目要求 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文,返回符合要求的最少分割次数. 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就 ...

  9. leetcode132. 分割回文串 II(dp)

    给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文. 返回符合要求的 最少分割次数 . 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割就可将 s ...

最新文章

  1. 使用VS.NET2003编写存储过程
  2. Webstorm修改svn时提示Error relocating working copy:Server SSL certificate rejected
  3. php 使用webservice_PHP中如何调用webservice的实例参考
  4. word粘贴至html特殊字符 粘贴后可能为乱码
  5. __asm___错误:“”前应有'=',',',',','asm'或'_attribute_'
  6. Ubuntu 14.04 AM335x TI-RTOS 编译
  7. 风变编程Python9 函数的学习
  8. 关于HTML的FORM上传文件问题
  9. 用CSS绘制实体三角形并说明原理
  10. 探秘中国网购的数据迷城
  11. ADS仿真 之 直流仿真示例
  12. QQ空间登录协议实现:易语言篇
  13. 受汉城改名鼓舞,世界各地掀起改名热潮,尤其是那个小日本(笑话)
  14. 铝碳化硅封装材料行业研究及十四五规划分析报告
  15. 微信小程序7个步骤告诉你怎么投放广告位
  16. [转] TCP/IP原理、基础以及在Linux上的实现
  17. 强于信贷弱于支付的P2P
  18. es - elasticsearch - aggs - metrics - t-test
  19. 【Python windows11修改器 】——制作一个简易的修改器,修改windwos11右键和一些小功能
  20. 【图解】如何击溃芝诺悖论

热门文章

  1. 15 个变量和方法命名的最佳实践
  2. Python爬虫(一)_HTTP的请求与响应
  3. eclipse编码设置
  4. CentOS安装Navicat
  5. 2017-2018-1 2015335 《信息安全系统设计基础》 第4周课上实践 (新补的,但不完整)...
  6. Nginx的配置文件nginx.conf详解
  7. 将方法定义在prototype上的好处
  8. VS2013常用快捷方式
  9. Testin云测试:QQ(4.2.0)安卓版客户端可用性优秀
  10. 网络协议 9 - TCP协议(下):聪明反被聪明误