正讀倒讀都一樣的整數 ,這個應該是最簡單的介紹了吧。
用程式怎麼簡單實現呢?
示例 1:
輸入: 「babad」
輸出: 「bab」
注意: 「aba」 也是乙個有效答案。
示例 2:
輸入: 「cbbd」
輸出: 「bb」
public
class
isplalindrome
public
static
boolean
isplalindrome
(string str)
//所有位除奇數字時的中間位均對應 返回true
return
true;}
}
這個程式應該不難理解
* 求解字串的最長回文串----暴力法 o(n^3)
* 通過兩層迴圈找出字串的所有子串 對每乙個子串進行判斷
* 將是回文串的子串儲存 當有新的回文串時,比較記錄中的回文串和當前回文串的長度
* 用較長的串替換當前串 如果兩串長度相同,保留舊的
* ps:如果想儲存所有的回文串 可以修改記錄回文串的結構為string陣列(鍊錶、hash表都可以)
public
static string longestplalindrome
(string original)
//將字串轉換為字元陣列
char
oriarray=original.
tochararray()
;int first=0;
int end=0;
//當前字串中回文串的始末位置 包含末位置
for(
int i=
0;i1;i++
)//兩次迴圈 查詢字串的所有子串
if(left>=right)
//是否比較完成 是字串是否為回文串的判斷條件}}
}//查詢結束 將陣列轉化為字串返回
return string.
valueof
(oriarray, first, end+1)
;}
動態規劃不是演算法,是一種方法
為了改進暴力法,我們首先觀察如何避免在驗證回文時進行不必要的重複計算。考慮 「ababa」 這個示例。如果我們已經知道 「bab」 是回文,那麼很明顯, 「ababa」 一定是回文,因為它的左首字母和右尾字母是相同的。
先看**吧
public
static string longestpalindrome2
(string s)}}
}return ret;
}
看懂了嗎?一維陣列?二維陣列?如果要計算的字串放到二位陣列裡面,你會驚奇的發現?s[a,b]是回文的話,是s[a]=s[b],軸對稱的。
事實上,只需使用恆定的空間,我們就可以在 o(n^2)的時間內解決這個問題。我們觀察到回文中心的兩側互為映象。因此,回文可以從它的中心展開,並且只有 2n - 12n−1 個這樣的中心。
public
static string longestpalindrome
(string s)
int start =
0, end =0;
//子串在原字串中的定位
for(
int i =
0; i < s.
length()
; i++
)//以上是不懂意思
}return s.
substring
(start, end +1)
;}/* * @author liuhaidong
* @description 中心結點法
* @date 9:50 2019/9/16 0016
**/private
static
intexpandaroundcenter
(string s,
int left,
int right)
return r - l -1;
}
就是那中間數,然後兩邊比較 最長回文子串(暴力法)
求最長回文子串最簡單最暴力的方法就是遍歷每乙個子串,看看這個子串是不是回文,是的話這個子串的長度有沒有最大的長度max大,遍歷每乙個子串的時間複雜度是o n 2 判斷乙個子串是不是回文子串的時間複雜度是o n 這三個for迴圈巢狀在一起所以時間複雜度為o n 3 include include in...
最長回文子串,中心擴充套件法 C語言
給定乙個字串 s,找到 s 中最長的回文子串。你可以假設 s 的最大長度為 1000。示例 1 輸入 babad 輸出 bab 注意 aba 也是乙個有效答案。示例 2 輸入 cbbd 輸出 bb 因為是找回文子串,所以使用中心擴充套件法,中心擴充套件有兩種,一種是以單個字元 i,i 為中心,乙個是...
回文串之中心擴充套件法
中心擴充套件法可以幫助減少在回文子串中暴力遍歷的一次迴圈,在普通暴力遍歷中,我們需要兩次迴圈分別確定左指標和右指標 即回文子串的左右邊界 然後還有一次迴圈向中間靠攏判斷。中心擴充套件法將向中心靠攏的這一步改為了由中心向兩邊延申,由於回文子串有奇數和偶數之分,所以中心擴充套件法的起始點需要分兩種情況討...