1. 程式人生 > >【Leetcode】驗證迴文字串。

【Leetcode】驗證迴文字串。

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。