題目描述
給定一個字符串,驗證它是否是迴文串,只考慮字母和數字字符,可以忽略字母的大小寫。
說明: 本題中,我們將空字符串定義爲有效的迴文串。
示例1:
輸入: s = “a man, a plan, a canal: Panama”
輸出: true
示例2:
輸入: s = “race a car”
輸出: false
思路分析
我們通過題意我們可知:
- 不考慮大小寫;
- 只需考慮字母與數字;
簡單的思考,我們可以通過if
語句判斷是否屬於[a-zA-Z]
,但是這樣有些繁瑣,我們這裏充分利用Java中String
自帶的函數來進行功能實現(這也是字符串題型與鏈表題型的一個差異之處,字符串具有更多的可操作函數與空間):
對於要求1 不考慮大小寫,則可以直接將字符串進行均小寫字母化s.toLowerCase()
; 對於要求2 只考慮字母與數字,則可通過正則表達式進行範圍篩選,比if
更爲簡潔和正規,這裏我們通過將非字母和數字的字符轉化爲空字符來對輸入字符串進行簡化s.toLowerCase().relplaceAll("[^0-9a-z]", "")
解題代碼
public static boolean solution(String s){
if(s == "") return true;
int len = s.length();
if(len == 1) return false;
s = s.toLowerCase().replaceAll("[^0-9a-z]", "");
len = s.length();
for(int i = 0, j = len-1; i < j; i++, j--){
if(s.charAt(i) != s.charAt(j))
return false;
}
return true;
}
複雜度分析
時間複雜度: 嚴格來說,我們對字符串進行了3次遍歷,第一次爲最小化字母;第二次爲字符替換,第三次則爲我們的功能循環體;但依舊爲常熟級,故時間複雜度爲O(N)
;
空間複雜度: 我們沒有藉助輔助容器,故空間複雜度爲O(1)
.
常用技巧小結
String.toLowerCase()
String.replaceAll()
正則表達式
Github源碼
完整可運行文件請訪問GitHub。