算法30:验证回文串

文章介绍了如何在Java中验证一个字符串是否为回文串,即正读反读都相同的特性。提供了双指针for、双指针while和反转Character三种解决方案,通过将字符串转为小写并移除非字母数字字符来处理。同时,文章强调了效率和对Character类的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、需求

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。

示例 2:

输入:s = "race a car"
输出:false
解释:"raceacar" 不是回文串。

示例 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

示例 4:

输入:s = "0P"
输出:false
解释:"0P" 不是回文串。

示例 5:

输入: s = "A,m a c: (ama)"
输出:true
解释:"amacama" 是回文串。

提示:

  • 1 <= s.length <= 2 * 105
  • s 仅由可打印的 ASCII 字符组成

二、思路分析图

在这里插入图片描述
在这里插入图片描述

三、代码

(一)数据初始化/调用函数

    /**
     * 入口
     *      125、验证回文串
     * 输入:
     *      "A man, a plan, a canal: Panama"
     * 输出:
     *      5
     * 解释:
     *      1.while
     *      2.for
     */
    @Test
    public void suanfa30()
    {
        // 初始化
//        String s = "A man, a plan, a canal: Panama";
//        String s = "0P";
//        String s = "Damosel, a poem? A carol? Or a cameo pale? (So mad!)";
        String s = "A,m a c: (am    a)!";

        // 打印
        boolean a = this.isPalindrome(s);
        System.out.println("验证回文串(双指针for方案) = " + a);

        boolean b = this.isPalindromeWhile(s);
        System.out.println("验证回文串(双指针while方案) = " + b);

        boolean c = this.isPalindromeCharacter(s);
        System.out.println("验证回文串(反转Character方案) = " + c);
    }

(二)双指针for方案

/**
 * 双指针for方案
 *
 * @param s
 * @return
 */
private boolean isPalindrome(String s)
{
    // 转为小写,并替换非0-9数字和a-z的字符为""
    String s2 =  s.toLowerCase().replaceAll("[^0-9a-z]", "");
    // 循环,条件一半数就好
    for (int i = 0; i < s2.length() / 2; i++)
    {
        // 开始第一个数 不等于 最后一个数
        if (s2.charAt(i) != s2.charAt(s2.length() - i - 1))
        {
            // 不等于就返回false
            return false;
        }
    }
    // 剩下的都符合了
    return true;
}

(三)双指针while方案

/**
 * 双指针while方案
 *
 * @param s
 * @return
 */
private boolean isPalindromeWhile(String s)
{
    String s2 =  s.toLowerCase().replaceAll("[^0-9a-z]", "");
    int index = 0;
    int i1 = s2.length() / 2;
    while (index < i1)
    {
        if (s2.charAt(index) != s2.charAt(s2.length() - index - 1))
        {
            return false;
        }
        index++;
    }
    return true;
}

(四)反转Character方案

/**
 * 反转Character方案
 *
 * @param s
 * @return
 */
private boolean isPalindromeCharacter(String s)
{
    StringBuffer sgood = new StringBuffer();
    int length = s.length();
    for (int i = 0; i < length; i++) {
        char ch = s.charAt(i);
        if (Character.isLetterOrDigit(ch)) {
            sgood.append(Character.toLowerCase(ch));
        }
    }
    StringBuffer sgood_rev = new StringBuffer(sgood).reverse();
    return sgood.toString().equals(sgood_rev.toString());
}

(五)结果图

在这里插入图片描述

作者:王子威

四、总结

  • 学习了验证回文串
  • 效率很低,还没想到效率高的
  • 学习了下Character类,这个是char的封装,也是工具
  • StringBuffer会效率高些
  • 算法兴趣+1 总:30
  • 加强了对算法的分析能力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值