309、验证回文串

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

  

示例 1:

输入: "A man, a plan, a canal: Panama"

输出: true

解释:"amanaplanacanalpanama" 是回文串

示例 2:

输入: "race a car"

输出: false

解释:"raceacar" 不是回文串

  

提示:

1 <= s.length <= 2 105

字符串 s 由 ASCII 字符组成

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/valid-palindrome

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

package cn.fansunion.leecode.isNumber;

/**

 * 验证回文串

 * 给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

力扣

 * @author wen.lei@brgroup.com

 *

 * 2022-2-18

 */

public class ValidPalindrome {

    /* 示例 1:

     

        输入: "A man, a plan, a canal: Panama"

        输出: true

        解释:"amanaplanacanalpanama" 是回文串

        示例 2:

     

        输入: "race a car"

        输出: false

        解释:"raceacar" 不是回文串*/

    /**

     * 从字符串中找出“字母数字”的字符串,复用之前一道题的方法。换汤不换药,新瓶装旧酒。

     * @param s

     * @return

     */

    public boolean isPalindrome(String s) {

        if(s==null||s.length()==0) {

            return false;

        }

        //cn.fansunion.leecode.isNumber.PalindromeNumber.isPalindromeStr(int)

        //整数版回文数的进阶,同一个问题,稍微有点区别。相同点,都需要对输入做一点处理

        String newStr=collectLetterDigit(s);

        return isPalindromeIntByStr(newStr);

    }

     

    /**

     * 从一个字符串中找出为字母或数字的字符,返回一个新的字符串,比如:“abc--]1 23”>"abc123"

     * @param s

     * @return

     */

    private String collectLetterDigit(String s) {

        StringBuilder sb = new StringBuilder();

        for(char ch:s.toLowerCase().toCharArray()) {

            if(Character.isLetterOrDigit(ch)) {

                sb.append(ch);

            }

        }

        return sb.toString();

    }

    //根据isPalindromeIntByStr,简单处理

    public boolean isPalindromeIntByStr(String numStr) {

        //左右比较,双指针

        for (int start = 0, end = numStr.length() - 1; start < end; start++, end--) {

            if (numStr.charAt(start)!=numStr.charAt(end)) {

                return false;

            }

        }

        return true;

    }

     

    /**

     * 仅供参考用:是否为回文数:number->str 进阶:你能不将整数转为字符串来解决这个问题吗?

     * @param x

     * @return

     */

    public boolean isPalindromeIntByStr(int x) {

        if (x < 0) {

            return false;

        }

        String numStr = String.valueOf(x);

        //左右比较,双指针

        for (int start = 0, end = numStr.length() - 1; start < end; start++, end--) {

            if (numStr.charAt(start)!=numStr.charAt(end)) {

                return false;

            }

        }

        return true;

    }

}

执行结果:通过

显示详情

添加备注

执行用时:4 ms, 在所有 Java 提交中击败了42.91%的用户

内存消耗:41 MB, 在所有 Java 提交中击败了17.97%的用户

通过测试用例:480 480

炫耀一下:

package test.leecode.isNumber;

import org.junit.Assert;

import org.junit.Test;

import cn.fansunion.leecode.isNumber.ValidPalindrome;

/**

 * @author wen.lei@brgroup.com

 *

 * 2022-2-19

 */

public class ValidPalindromeTest {

     

    @Test

    public void test() {

        //isPalindrome

        ValidPalindrome vp = new ValidPalindrome();

        Assert.assertTrue(vp.isPalindrome("A man, a plan, a canal: Panama"));

        Assert.assertTrue(vp.isPalindrome("abcd-dc-ba"));

        Assert.assertFalse(vp.isPalindrome("race a car"));

        Assert.assertFalse(vp.isPalindrome("abcd-dc-ba1"));

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值