一、前言:
👨🎓作者:bug菌
✏️部落格:CSDN、掘金等
💌公衆号:猿圈奇妙屋
🚫特别聲明:原創不易,轉載請附上原文出處連結和本文聲明,謝謝配合。
🙏版權聲明:文章裡可能部分文字或者圖檔來源于網際網路或者百度百科,如有侵權請聯系bug菌處理。
哈喽,小夥伴們,我是bug菌呀👀。金三銀四,又到了刷題月啦。是以不管你是準備跳槽還是在職,都一起行動起來,順應這個時代月幹點該幹的事兒👣。是以,趕緊跟着bug菌的步伐卷起來吧⏰,變強從這一刻開始!➕🧈
小夥伴們在批閱文章的過程中如果覺得文章對您有一絲絲幫助,還請别吝啬您手裡的贊呀,大膽的把文章點亮👍吧,您的點贊三連(收藏⭐️+關注👨🎓+留言📃)就是對bug菌我創作道路上最好的鼓勵與支援😘。時光不棄🏃🏻♀️,創作不停💕,加油☘️
二、題目描述:
題目:
給定一個字元串,驗證它是否是回文串,隻考慮字母和數字字元,可以忽略字母的大小寫。
說明:本題中,我們将空字元串定義為有效的回文串。
具體請看如下示例:
示例 1:
輸入: "A man, a plan, a canal: Panama"
輸出: true
解釋:"amanaplanacanalpanama"

示例 2:
輸入: "race a car"
輸出: false
解釋:"raceacar"
提示:
-
1 <= s.length <= 2 * 105
- 字元串
由 ASCII 字元組成s
題目來源:LeetCode官網
題目難度:⭐⭐
三、思路分析:
這題我在前期給大家講過啦,不知道同學們有沒有印象,不過沒有了也沒關系,就看我今天是怎麼教會你的,讓你遇到回文串的題再也不需要去糾結思緒了。
首先分析題意可得。不區分大小寫且忽略符号,那就隻需要處理數字與字母即可。是以做法如下:
對字元串
str
進行周遊(一次),保留字母和數字字元,并按原順序存放在另一個字元串 newStr 中,這樣就隻需要判斷 newStr 是否是一個普通的回文串即可。
思路1(暴力法):
将newStr整串進行翻轉後(
newStrReverse
)與
newStr
比較,如果相同則是回文串。
思路2(雙指針法):
對
newStr
采用雙指針法,分别從兩頭向中間取值,每次移動一步,逐一判斷所指向的字元串是否相同。當兩指針相遇即表示這是一個回文串。
如下我将來為大家示範一下這兩種實作方式吧。
四、算法實作:
1、暴力法_AC代碼
具體算法代碼實作如下:
class Solution {
public boolean isPalindrome(String s) {
//建立一個字元串集
StringBuffer newStr = new StringBuffer();
int length = s.length();
//周遊取出字母跟數字字元。
for (int i = 0; i < length; i++) {
//擷取目前i處的字元
char ch = s.charAt(i);
//api用法:判斷字元是否是一個字母或數字。如果不是傳回false。
if (Character.isLetterOrDigit(ch)) {
//将大寫字母轉小寫
newStr.append(Character.toLowerCase(ch));
}
}
//将擷取到的newStr進行翻轉
StringBuffer newStrReverse = new StringBuffer(newStr).reverse();
//直接兩者比較。
return
2、雙指針法_AC代碼
具體算法代碼實作如下:
class Solution {
public boolean isPalindrome(String s) {
//建立一個字元串集
StringBuffer newStr = new StringBuffer();
int length = s.length();
//周遊取出字母跟數字字元。
for (int i = 0; i < length; i++) {
//擷取目前i處的字元
char ch = s.charAt(i);
//api用法:判斷字元是否是一個字母或數字。如果不是傳回false。
if (Character.isLetterOrDigit(ch)) {
//将大寫字母轉小寫
newStr.append(Character.toLowerCase(ch));
}
}
int n = newStr.length();
int left = 0, right = n - 1;
//進行兩指針相向逐一判斷
while (left < right) {
//隻要遇到不相等的結果,直接false傳回即可。
if (newStr.charAt(left) != newStr.charAt(right)) {
return false;
}
//一個向右,一個向左。
left++;
right--;
}
return true;
}
}
五、總結:
1、暴力法之leetcode送出運作結果截圖如下:
複雜度分析:
- 時間複雜度:O(∣s∣)。其中|s|是字元串s 的長度。
- 空間複雜度:O(∣s∣)。由于我們需要将所有的字母和數字字元存放在另一個字元串中,在最壞情況下,新的字元串 newStr 與原字元串 s 完全相同,是以需要使用 O(|s|) 的空間。
2、雙指針法之leetcode送出運作結果截圖如下:
複雜度分析:
- 時間複雜度:O(∣s∣)。其中|s|是字元串s 的長度。
- 空間複雜度:O(∣s∣)。由于我們需要将所有的字母和數字字元存放在另一個字元串中,在最壞情況下,新的字元串 newStr 與原字元串 s 完全相同,是以需要使用 O(|s|) 的空間。
怎麼樣,看完我coding之後,是不是豁然開朗,是不是特别簡單,說實在的也就那樣,先去除雜質,那就跟以往遇到的算法題是一樣的, 給你一個标準字元串然後讓你判斷是不是回文串,這不就要麼整體使用
StringBuffer
類提供的方法
reverse()
方法、要麼就自己左右指針相向移動逐一校驗判斷是否字元串一緻。
再者,解題道路千萬條,歡迎小夥伴們腦洞大開,如果你們有啥更好的想法或者思路,歡迎評論區告訴我哦,大家一起互相借鑒互相學習,方能成長的更快。
好啦,以上就是本期的所有内容啦,咱們下期見咯。
六、熱門推薦:
- leetcode-9.回文數
- leetcode-1.兩數之和
- leetcode-13.羅馬數字轉整數
- leetcode-14.最長公共字首
- leetcode-20.有效的括号
- leetcode-21.合并兩個有序連結清單
- leetcode-26. 删除有序數組中的重複項
七、文末:
《每日一題LeetCode》,帶着你一塊兒刷題,專欄每一篇都附帶詳細解法,手把手帶你解題。
一個人刷可能會覺得很累很難堅持,但是一群人刷就會覺得它是一件很有意義的事兒,互相督促互相鼓勵,一起變強。
我是bug菌,一名想走👣出大山改變命運的程式猿。接下來的路還很長,都等待着我們去突破、去挑戰。來吧,小夥伴們,我們一起加油!未來皆可期,fighting!
最後送大家兩句話,與諸君共勉!
☘️做你想做的人,沒有時間限制,隻要願意,什麼時候都可以start,
🍀你能從現在開始改變,也可以一成不變,這件事,沒有規矩可言,你可以活出最精彩的自己。
💌如果文章對您有所幫助,就請留下您的贊吧!(#^.^#);
💝如果喜歡bug菌分享的文章,就請給bug菌點個關注吧!(๑′ᴗ‵๑)づ╭❤~;
💗如果對文章有任何疑問,還請文末留言或者加群吧【QQ交流群:708072830】;