【算法】双指针算法 ( 有效回文串 II )
生活随笔
收集整理的這篇文章主要介紹了
【算法】双指针算法 ( 有效回文串 II )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
算法 系列博客
【算法】刷題范圍建議 和 代碼規范
【算法】復雜度理論 ( 時間復雜度 )
【字符串】最長回文子串 ( 蠻力算法 )
【字符串】最長回文子串 ( 中心線枚舉算法 )
【字符串】最長回文子串 ( 動態規劃算法 ) ★
【字符串】字符串查找 ( 蠻力算法 )
【字符串】字符串查找 ( 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 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【算法】双指针算法 ( 双指针算法分类
- 下一篇: 【算法】哈希表 ( 两数之和 )