【Leetcode】驗證迴文字串。
阿新 • • 發佈:2018-11-28
Leetcode
題目要求
給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫
說明:本題中,我們將空字串定義為有效的迴文串;
- 示例1.
- 輸入: “A man,a plan,a canal:Panama”
- 輸出:true
- 示例2.
- 輸入:“race a car”
- 輸出:false
核心思想
1.先將字串變為小寫,因為本題忽略了字母的大小寫。
2.利用字元的ASCII值進行驗證
3.採用雙指標的辦法,一個指向頭,一個指向尾,同時向中間靠攏,過程中兩指標指向目標不相等則退出返回false,直到兩個指標匯合,則驗證成功,即是迴文串。
解法一(未優化)
/**
*
* 給定一個字串,驗證它是否是迴文串,只考慮字母和數字字元,可以忽略字母的大小寫
* 說明:本題中,我們將空字串定義為有效的迴文串;
* 示例1.
* 輸入: "A man,a plan,a canal:Panama"
* 輸出:true
* 示例2.
* 輸入:"race a car"
* 輸出:false
*
* @author mac
*
*/
public class Solution {
public boolean isPalindrome(String s) {
//先將s變為小寫
s = s.toLowerCase ();
char[] strArray = s.toCharArray();
System.out.println(strArray);
int i = 0;
int j = strArray.length - 1;
//利用ASCII碼值進行驗證
while(i < j) {
//48~57是數字,97~122是小寫英文,65~90是大寫英文
while((int)strArray[i] < 48 || ((int)strArray[i] > 57 &&(int)strArray[i] < 97) || (int)strArray[i] > 122) {
i++;
}
while((int)strArray[j] < 48 || ((int)strArray[j] > 57 &&(int)strArray[j] < 97) || (int)strArray[j] > 122) {
j--;
}
if(strArray[i] != strArray[j]){
return false;
}else {
i++;
j--;
}
}
return true;
}
public static void main(String[] args) {
Solution sl = new Solution();
String str = "A man,a plan,a canal:Panama";
String str2 = "race a car";
System.out.println(sl.isPalindrome(str));
System.out.println(sl.isPalindrome(str2));
}
}
這裡會有一個問題,如果字串是空的,或者超級長,就會產生錯誤,所以我們可以進行優化
解法二
class Solution {
public boolean isPalindrome(String s) {
//轉為小寫
s = s.toLowerCase();
int start = 0;
int end = s.length() - 1;
while (start < end && start < s.length() - 1) {
char bgChar = s.charAt(start);
char edChar = s.charAt(end);
//在這裡判斷用了兩種方式 1.while 2.if 作用是一樣的
while (!((bgChar >= 'a' && bgChar <= 'z') || (bgChar >= '0' && bgChar <= '9')) && start < s.length() - 1) {
start++;
bgChar = s.charAt(start);
}
if (!((edChar >= 'a' && edChar <= 'z') || (edChar >= '0' && edChar <= '9'))) {
end--;
continue;
}
if (bgChar != edChar) {
return false;
}
start++;
end--;
}
return true;
}
public static void main(String[] args) {
Solution sl = new Solution();
String str = "A man,a plan,a canal:Panama";
String str2 = "race a car";
String str3 = "0P";
String str4 = ",.";
System.out.println(sl.isPalindrome(str));
System.out.println(sl.isPalindrome(str2));
System.out.println(sl.isPalindrome(str3));
System.out.println(sl.isPalindrome(str4));
}
}
注意這裡的判斷不能用while。