【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。

猜你喜欢

转载自blog.csdn.net/weixin_42967016/article/details/84582034
今日推荐