【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )
生活随笔
收集整理的這篇文章主要介紹了
【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
文章目錄
- 一、雙指針算法分類
- 二、相向雙指針示例 ( 有效回文串 )
一、雙指針算法分類
面試時經常遇到 限制算法復雜度為 O(n)O ( n )O(n) 的情況 , 就需要使用以下算法 :
- 雙指針算法 : 設置兩個指針 ( 索引 ) , 進行不同方式的遍歷 , 使用最高頻的算法 ;
- 打擂臺算法 : 設置一個擂主值 , 設置為無窮大或無窮小 , 通過遍歷讓該擂主值與遍歷值打擂臺 ; 求最大值最小值常用 ;
- 單調棧算法 ;
- 單調隊列算法 ;
雙指針算法分類 :
- 相向雙指針 : 判斷一個字符串是否是回文串 , 從兩邊向中心遍歷 ;
- 背向雙指針 : 查找一個字符串的最長回文子串使用的 " 中心線枚舉算法 " 就是背向雙指針算法 , 從中心向兩邊遍歷 ; ( 出現頻率較 - 低 )
- 同向雙指針 :
相向雙指針算法分類 :
- 翻轉類型 : ① 翻轉字符串 , ② 判斷回文串 ; 兩個指針分別指向收尾 , 兩邊往中間走 , 對比兩個指向的元素是否相等 ;
- 兩數之和型 : ① 兩數之和 , ② 三數之和 ;
- 分割類型 : ① 快速排序 , ② 顏色排序 ; 給定一個數組 , 將其分割成兩部分 , 一部分滿足某條件 , 另外一部分不滿足某條件 ;
二、相向雙指針示例 ( 有效回文串 )
有效回文串 : https://www.lintcode.com/problem/415/
如果是不忽略大小寫 , 特殊字符的情況 , 可以直接 翻轉字符串 , 然后對比是否相等 ;
但是如果添加了上述要求 , 就需要處理大小寫 , 特殊字符問題 , 有兩種方案 :
- 創建新字符串 , 過濾掉大小寫及特殊字符干擾, 然后翻轉字符對比 , 這樣會增加額外空間開銷 ;
- 推薦使用雙指針算法 , 一邊進行過濾 , 一邊進行對比 ;
設計兩個指針 , 分別指向字符串的最左側 和 最右側 ;
每次遍歷 , 都要進行 兩個指針的下標判斷 , 否則就會導致下標訪問越界 ;
代碼示例 :
public class Solution {/*** @param s: 一個字符串* @return: 該字符串是否有有效回文串*/public boolean isPalindrome(String s) {if (s == null) {return false;}// 雙指針int left = 0, right = s.length() - 1;while (left < right) {// 左指針向右移動, 一直移動, 直到遇到一個合法的字符, 即字母或數字while (left < right && !isValid(s.charAt(left))) {left ++;}// 右指針向左移動, 一直移動, 直到遇到一個合法的字符, 即字母或數字while (left < right && !isValid(s.charAt(right))) {right --;}// 對比兩個指針指向的字符, 如果不相等, 則說明該字符串不是有效回文串if (left < right && !isEqual(s.charAt(left), s.charAt(right))) {return false;}// 兩指針相向移動left++;right--;}return true;}/*** 判定字符串是否是字母或數字* @param c 被判定的字符串* @return 是否是字母或數字*/private boolean isValid(char c) {return Character.isLetter(c) || Character.isDigit(c);}/*** 對比兩個字符是否相等, 忽略大小寫, 先將字符轉為小寫字母, 然后再對比* @param a 對比的字符一* @param b 對比的字符二* @return 字符轉為小寫字母后, 是否相等*/private boolean isEqual(char a, char b) {return Character.toLowerCase(a) == Character.toLowerCase(b);} }class Main{public static void main(String[] args) {boolean isPalindrome = new Solution().isPalindrome("A man, a plan, a canal: Panama");System.out.println(isPalindrome);} } 《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的【算法】双指针算法 ( 双指针算法分类 | 相向双指针 | 有效回文串 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【字符串】字符串查找 ( Rabin-K
- 下一篇: 【算法】双指针算法 ( 有效回文串 II