LeetCode:Valid Palindrome

牧云@^-^@ 提交于 2019-11-29 04:43:20

1、题目名称

Valid Palindrome(回文字符串)

2、题目地址

https://leetcode.com/problems/valid-palindrome/

3、题目内容

英文:Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

中文:给出一个字符串,只考虑字母和数字,判断该字符串是否为回文字符串

例如:

"A man, a plan, a canal: Panama" 是一个回文字符串

"race a car" 不是一个回文字符串

4、题目分析

如果要判断一个字符串是否是回文字符串,可以两个变量,从两侧开始比较有效的字符是否相等。这里有效的字符是指 'a'-'z'、'A'-'Z'、'0'-'9' 这三个区间内的字符。

5、解题方法1

可以将字符串中有效的字符,写入一个链表,再将链表转化为数组,直接判断数组两侧对称位置的字符是否匹配。

实现的Java代码如下:

import java.util.LinkedList;

/**
 * 功能说明:LeetCode 125 - Valid Palindrome
 * 开发人员:Tsybius2014
 * 开发时间:2015年8月4日
 */
public class Solution {
    
    /**
     * 检测一个字符串是否是回文(忽略大小写,只考虑英文和数字)
     * @param s 被检测字符串
     * @return
     */
    public boolean isPalindrome(String s) {
        
        if (s == null) {
            return false;
        }
        
        if (s.trim().isEmpty()) {
            return true;
        }
        
        //将有效字符选出并存入链表
        LinkedList<Character> linkedList = new LinkedList<Character>();
        for (char ch : s.toCharArray()) {
            if ((ch >= 'a' && ch <= 'z') || (ch >= '0' && ch <= '9')) {
                linkedList.add(ch);
            } else if (ch >= 'A' && ch <= 'Z') {
                linkedList.add((char)(ch + 'a' - 'A'));
            }
        }
        if (linkedList.size() <= 1) {
            return true;
        }

        //将链表转换为数组比较
        Object[] array = linkedList.toArray();
        for (int i = 0; i <= array.length / 2; i++) {
            if (!array[i].equals(array[array.length - 1 - i])) {
                return false;
            }
        }
        
        return true;
    }
}

6、解题方法2

选择两个数字i和j,直接从字符串的首和尾开始循环,直到i>=j为止。如果出现两侧对应字符不匹配的情况,则直接判定此字符串不是回文字符串。全部字符考察完毕后,如果未发现对应位置字符不匹配的情况,则认为此字符串是回文字符串。

实现的Java代码如下:

import java.util.LinkedList;

/**
 * 功能说明:LeetCode 125 - Valid Palindrome
 * 开发人员:Tsybius2014
 * 开发时间:2015年8月4日
 */
public class Solution {
    
    /**
     * 检测一个字符串是否是回文(忽略大小写,只考虑英文和数字)
     * @param s 被检测字符串
     * @return
     */
    public boolean isPalindrome(String s) {

        if (s == null) {
            return false;
        }
        
        if (s.trim().isEmpty()) {
            return true;
        }
        
        int i = 0;
        int j = s.length() - 1;
        
        int chLeft; //左侧字符
        int chRight; //右侧字符
        while (i < j) {
            
            chLeft = s.charAt(i);
            chRight = s.charAt(j);

            //既非英文也非数字的字符直接忽略
            if (!(chLeft >= 'A' && chLeft <= 'Z') &&
                !(chLeft >= 'a' && chLeft <= 'z') &&
                !(chLeft >= '0' && chLeft <= '9')) {
                i++;
                continue;
            }

            if (!(chRight >= 'A' && chRight <= 'Z') &&
                !(chRight >= 'a' && chRight <= 'z') &&
                !(chRight >= '0' && chRight <= '9')) {
                j--;
                continue;
            }
                        
            //大写英文字母转成小写
            if (chLeft >= 'A' && chLeft <= 'Z') {
                chLeft = chLeft + 'a' - 'A';
            }
            
            if (chRight >= 'A' && chRight <= 'Z') {
                chRight = chRight + 'a' - 'A';
            }
            
            //比较字符
            if (chLeft != chRight) {
                return false;
            } else {
                i++;
                j--;
            }
        }
        
        return true;
    }
}

END

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!