【字符串】最长回文子串 ( 蛮力算法 )
文章目錄
- 一、回文串、子串、子序列
- 二、最長回文子串
- 1、蠻力算法
- 2、時間復雜度最優方案
一、回文串、子串、子序列
" 回文串 ( Palindrome ) " 是 正反都一樣的字符串 , abccba , 001100 等字符串 ;
給定一個字符串 " abcd " ,
" 子串 ( SubString ) "是連續取的子字符串 , 如 : “ab” , “bc” , “cd” , “bcd” 等 , 不能跳躍字符 ; ( 連續字符 )
nnn 個字符串的子串個數是 n(n+1)2+1\cfrac{n(n+1)}{2} +12n(n+1)?+1 個 ;
" 子序列 ( SubSequence ) " 是可以非連續取字符串中的字符 , 前后順序不允許顛倒 , 如 “ad” , “bd” , “acd” 等 ; ( 非連續字符 )
nnn 個字符串的子串個數是 2n2^n2n 個 ( 集合的子集數 ) ;
二、最長回文子串
問題鏈接 : https://www.lintcode.com/problem/200/description
給出一個字符串(假設長度最長為1000),求出它的最長回文子串,你可以假定只有一個滿足條件的最長回文串。
1、蠻力算法
蠻力算法 :
① 先獲取所有的子串 ; 嵌套兩層循環 , 外層循環起點索引 , 內層循環終點索引 , 將 n(n+1)2+1\cfrac{n(n+1)}{2} +12n(n+1)?+1 個子串都遍歷出來 ; 該操作是 O(n2)O(n^2)O(n2) 的算法復雜度 ;
② 驗證子串是否是回文串 ; 使用 相向雙指針算法 , 設置兩個指針 , 左指針指向字符串開始位置 , 右指針指向字符串結束位置 , 對比左右指針是否相等 , 如果相等 , 左指針遞增 , 右指針遞減 , 繼續判定指向的字符是否相等 ; 該操作是 O(n)O(n)O(n) 的算法復雜度 ;
上述操作總的 時間復雜度是 O(n3)O(n^3)O(n3) ; 面試的時候寫這個算法 , 基本就涼了 ;
嵌套循環 , 外層循環必須從長度最長的開始進行 , 內層循環從 000 索引開始 ;
代碼示例 :
public class Solution {/*** @param s: input string* @return: a string as the longest palindromic substring*/public String longestPalindrome(String s) {if (s == null) {return null;}for (int length = s.length(); length > 0; length--) {for (int start = 0; length + start <= s.length(); start++) {if (isPalindrome(s, start, start + length - 1)) {return s.substring(start, start + length);}}}return "";}private boolean isPalindrome(String s, int left, int right) {while(left < right && s.charAt(left) == s.charAt(right)) {left++;right--;}return left >= right;} }class Main{public static void main(String[] args) {String palindrome = new Solution().longestPalindrome("abb");System.out.println(palindrome);} }O(n3)O(n^3)O(n3) 時間復雜度算法 , 耗時較長 ;
2、時間復雜度最優方案
時間復雜度最優方案 : Manacher 算法 可以在 O(n)O(n)O(n) 時間內獲得最長回文串 , 這是時間復雜度最優方案 , 但是屬于背誦問題 ; 一般面試側重與邏輯與編程能力 ;
不要求實現上述方案 ;
總結
以上是生活随笔為你收集整理的【字符串】最长回文子串 ( 蛮力算法 )的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【错误记录】Android 编译时技术报
- 下一篇: 【Android 组件化】路由组件 (