怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...
干貨預警:所有文章都會首發于我的公眾號【甜姨的奇妙冒險】,歡迎watch。
一、來歷:
力扣從3月開始開啟了每日一題打卡活動,于是跟風加入了打卡大軍,這兩天寫評論、發題解,沒想到反響還不錯,收到了來自很多同學的鼓勵與好評,短短幾天就170的關注了,有的同學說每天都會蹲我的評論和題解哈哈 ,本來覺得wx公眾號是比較私人的趣味(つд?),但不由萌生了在公眾號開一個專欄寫每日一題的想法,有啥問題或想法可以私信我,anytime。本文重點在第五部分細節說明。
二、原題描述:
三、題目分析:
這題是道簡單的構造性題目,只需要盡可能的左右對稱地構造字符串就行了。所以最終的回文串中所有的字符都左右對稱地出現了偶數次(對于奇數長度的回文串,最中間的那個字符可以出現奇數次)。
比如偶數長度的回文串 “abba”,每個字符都出現了偶數次;
比如奇數長度的回文串“abcbcbcba”,c出現了奇數次,其它字符都出現了偶數次。
四、AC代碼:
class再提供Java8的流式寫法:
class五、細節說明(咳咳..劃重點~~)
代碼本身很簡單,但有很多細節我覺得才是最重要的。【一臉認真哦 ξ( ?>??)
1. 計數為啥用數組?
counter計數是很常見的場景了,對于數據范圍有限的計數,直接用數組就行了,看見很多同學用的HashMap,額外增加了hash的計算成本、鏈表(樹)Node的創建開銷等,在時間、空間上都不討好喲。
2. 為啥counter數組的長度是58?
因為A~z的范圍是'z' - 'A' + 1= 122 - 65 + 1 = 58,打印看看就知道了(但我覺得常見的幾個ascii碼記住的話日常會方便很多喲,比如'A'是65,'a'是97)。
3. x - (x & 1) 是什么意思?
合理的運用位運算可以讓代碼減少一些不必要的判斷分支。
如果 x 是奇數,x & 1 的結果就是1,偶數就是0,實現了偶數不變、奇數減1的邏輯。當然這里還有另外一種位運算寫法: (x >> 1) << 1 ,先右移一位去掉最末位的0或1,再左移一位,也實現了偶數不變、奇數減1的邏輯。
4. 這里為啥不寫成x - x % 2?
取模是一個消耗較大的操作,因此大多數語言的編譯器比如C++都對模運算進行了優化,比如可以將 x%2 優化成 x&1,這種情況下怎么寫都一樣啦。但是Java比較特殊,Java中是不存在無符號整型的,數字是用補碼來表示的(大家還記得補碼吧...最高位是符號位,0表示正數,1表示負數),所以對于負數來說,%2 與 &1 兩個操作是完全不同的(如下):
int因此我覺得jvm很難對模運算進行優化(當然也有可能優化,比如先判斷一下是不是正數,但我覺得這么麻煩的話,可能并沒有優化 )總之,結論就是:能用 & 就不要取模。這里提一下一個常見的規律,對于模數是2的冪的情況下,都可以優化成&運算,如下:
int5. 流式寫法看不懂?以及流式寫法這里為啥慢?
s.chars()的返回值是一個 IntStream,就是Int的流;
.boxed()會裝箱返回Stream<Integer>;
.collect()是聚合的算子,Collectors.toMap的三個參數分別是 keyMapper,valueMapper 和 mergeFunction。分別表示聚合出來的 Map 的 key 是什么,value 是什么,如果遇到key相同的,怎么合并值。
counter.values() 返回的是map值的集合Collection<Integer>,先用.stream()轉成流以后,利用mapToInt 轉成 IntStream,因為 IntStream 是支持 sum 算子的,通過sum算子進行求和。
最后,至于為啥這里流運算比傳統循環慢,是因為對于小數據集無法發揮流的優勢,這里只是為了介紹這種優雅的寫法。
六、類似題目
Easy:
1. 判斷是否是回文串(125. 驗證回文串)
2. 判斷是否是回文鏈表 (234. 回文鏈表)
3. 判斷是否是回文數 (9. 回文數)
Medium:
4. 符串里有多少個回文子串(647. 回文子串)
5. 找到最長的回文子串(5. 最長回文子串)
關于 最長回文子串, 還有一個特定的算法叫做 Manacher算法,該算法巧妙地利用插入不存在的字符將回文串都轉成奇數回文串,比如abba變成了#a#b#b#a#(字符串中心是#), abcba變成了#a#b#c#b#a#(字符串中心是c) ,有興趣的同學可以去學習學習~
以上,蟹蟹寶寶們的觀看~(?? ? ?)?
恕我直言,在座的各位都是dalao!!
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的怎么判断一个字符串的最长回文子串是否在头尾_【Leetcode每日打卡】最长回文串...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 分析excel模板_java如
- 下一篇: powerdesigner 反向工程 o