Topic
- String
- Two Pointers
Description
https://leetcode.com/problems/valid-palindrome/
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
Example 1:
Input: "A man, a plan, a canal: Panama"
Output: true
Example 2:
Input: "race a car"
Output: false
Constraints:
- s consists only of printable ASCII characters.
Analysis
方法一:我写的方法。双指针,从字符串两端向中间,逐两个合法字符判断,直到双指针相遇为止
方法二:别人写的方法。原来存在Character.isLetterOrDigit()方便方法的,现在才知道。
方法三:用正则表达式将字符串非法字符剔除,转小写,然后克隆,逆转,跟原字符串相比是否相等。
Submission
package com.lun.easy;
public class ValidPalindrome {
//方法一:我写的方法
public boolean isPalindrome1(String s) {
if (s == null)
return false;
s = s.toLowerCase();
int left = 0, right = s.length() - 1;
while (left < right) {
char leftChar = s.charAt(left);
if (!isNum(leftChar) && !isLetter(leftChar)) {
left++;
continue;
}
char rightChar = s.charAt(right);
if (!isNum(rightChar) && !isLetter(rightChar)) {
right--;
continue;
}
if (leftChar == rightChar) {
left++;
right--;
} else {
return false;
}
}
return true;
}
private boolean isNum(char c) {
return '0' <= c && c <= '9';
}
private boolean isLetter(char c) {
return 'a' <= c && c <= 'z';
}
//方法二:别人写的方法
public boolean isPalindrome2(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;
}
//方法三:别人写的方法
public boolean isPalindrome3(String s) {
String actual = s.replaceAll("[^A-Za-z0-9]", "").toLowerCase();
String rev = new StringBuffer(actual).reverse().toString();
return actual.equals(rev);
}
}
Test
import static org.junit.Assert.*;
import org.junit.Test;
public class ValidPalindromeTest {
@Test
public void test() {
ValidPalindrome obj = new ValidPalindrome();
assertTrue(obj.isPalindrome1("A man, a plan, a canal: Panama"));
assertFalse(obj.isPalindrome1("race a car"));
assertTrue(obj.isPalindrome2("A man, a plan, a canal: Panama"));
assertFalse(obj.isPalindrome2("race a car"));
assertTrue(obj.isPalindrome3("A man, a plan, a canal: Panama"));
assertFalse(obj.isPalindrome3("race a car"));
}
}