LeetCode - Easy - 125. Valid Palindrome

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"));
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值