Leetcode OJ 125 Valid Palindrome
题目描述:
Given a string, determine if it is a palindrome,considering only alphanumeric characters and ignoring cases.
For example,
"A man, a plan, a canal: Panama" is a palindrome.
"race a car" is not a palindrome.
Note:
Have you consider that thestring might be empty? This is a good question to ask during an interview.
For the purpose of this problem, we define empty stringas valid palindrome.
题目理解:
给定一个字符串,判断它是否是回文字符串。只考虑数字和字母的字符,其他字符忽略。
"A man, a plan, a canal: Panama"是回文字符串。
"1A man, a plan, a canal: Panama"不是回文字符串。
测试用例:
功能测试:输入带大小写字母、数字、其他字符的回文/不回文字符串、输入不带字母、数字的字符串;
特殊输入:输入是null;
分析:
1. 将所有字符串的大写字母转换为小写字母;
2. 设置两个指针,一个前向指针forward从字符串的启示位置开始向后移动,一个后向指针backward从字符串的末尾往前移动;
3. 当forward小于等于backward时进行以下循环:
4. 移动forward直至forward所指向的字符是字母或数字,注意指针的溢出判断;
5. 移动backward直至backward所指向的字符是字母或数字,注意指针的溢出判断;
6. 因为移动了指针forward、backward,需再进行指针的大小判断;
7. 判断指针所指的字符(字母或数字)是否相等,相等则继续循环,不等则返回false;
8. 当最外层循环结束即forward>backward,说明是回文字符串,返回true
解答:
public static boolean isPalindrome(String s) {
if(s.length()== 0 ||s.length() == 1) return true;
int backward= s.length()-1;
int forward= 0;
s = s.toLowerCase();
char[]s_char = s.toCharArray();
while(forward<= backward){
while(forward< s.length() &&(s_char[forward] < 'a' ||s_char[forward] > 'z') && (s_char[forward] < '0' || s_char[forward] > '9'))
forward++;
while(backward> 0 &&(s_char[backward] < 'a' || s_char[backward] > 'z') && (s_char[backward] < '0' || s_char[backward] > '9'))
backward--;
if(forward> backward) break;
if(s_char[forward]!= s_char[backward]) returnfalse;
forward++;
backward--;
}
return true;
}
其他解答:
public class Solution { public boolean isPalindrome(String s) { if (s.isEmpty()) { return true; } int head = 0, tail = s.length() - 1; char cHead, cTail; while(head <= tail) { cHead = s.charAt(head); cTail = s.charAt(tail); if (!Character.isLetterOrDigit(cHead)) { head++; } else if(!Character.isLetterOrDigit(cTail)) { tail--; } else { if (Character.toLowerCase(cHead) != Character.toLowerCase(cTail)) { return false; } head++; tail--; } } return true; } }