LeetCode算法题-Valid Palindrome(Java实现)

轮廓系数(Silhouette Coefficient) 轮廓系数(Silhouette Coefficient)是一种评估聚类效果的指标,用来衡量数据点在聚类中的紧密程度和分离程度。每个数据点的轮廓系数是通过比较该点与其所在聚类内的点的平均距离(内聚度)和该点与最近的其他聚类中的点的平均距离(分离度)来计算的。轮廓系数的值范围从-1到1,其中接近1的值表示该点很好地匹配其自身聚类,并且与相邻聚类差异很大,而接近-1的值则表示该点更适合与相邻的聚类而不是当前聚类。 阅读详情

这是悦乐书的第174次更新,第176篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第33题(顺位题号是125)。给定一个字符串,确定它是否是回文,只考虑字母数字字符并忽略大小写。空字符串是有效回文。例如:

输入:“A man, a plan, a canal: Panama”
输出:true

输入:“race a car”
输出:false

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

特殊情况一:当传入的字符串为null时,直接返回true。

特殊情况二:当传入的字符串去掉空格后的长度为0时,直接返回true。

正常情况:因为传入的字符串可能包含特殊字符,如空格、","、":"、"?"等,这些都是非字母、数字字符,这对我们的判断增加了难度,但是其核心思想是不变的。

首先可以将字符串全部转为小写,然后建立两个索引,一个从前往后,一个从后往前,依次获取相应的字符,在判断是否相等前,先要判断获取到的字符是否是字母、数字,不是字母和数字,索引向前移动一位,否则判断两个字符是否相等,不等于直接返回false,如果等于,索引向前移动一位,继续循环,直到遍历完判断完所有的字符。

public boolean isPalindrome(String s) {
    if (s == null || s.trim().length() == 0) {
        return true;
    }
    s = s.toLowerCase();
    int left = 0;
    int right = s.length() - 1;
    while (left <= right) {
        Character c1 = s.charAt(left);
        Character c2 = s.charAt(right);
        if (!isAlphaNumeric(c1)) {
            left++;
        }else if (!isAlphaNumeric(c2)) {
            right--;
        } else {
            if (c1 != c2) {
                return false;
            }
            left++;
            right--;
        }
    }
    return true;
}

public static boolean isAlphaNumeric(Character c){
    if (c >= 'a' && c<= 'z') {
        return true;
    }
    if (c >= 'A' && c<= 'Z') {
        return true;
    }
    if (c >= '0' && c<= '9') {
        return true;
    }
    return false;
}

03 第二种解法

此解法和第一种解法思路一样,但是借助了Character.isLetterOrDigit()方法来帮我们判断获取到的字符是否为字母或者数字。

public boolean isPalindrome2(String s) {
    if (s == null || s.trim().length() == 0) {
        return true;
    }
    s = s.toLowerCase();
    int left = 0;
    int right = s.length() - 1;
    while (left <= right) {
        Character c1 = s.charAt(left);
        Character c2 = s.charAt(right);
        if (!Character.isLetterOrDigit(c1)) {
            left++;
        } else if (!Character.isLetterOrDigit(c2)) {
            right--;
        } else {
            if (c1 != c2) {
                return false;
            } 
            left++;
            right--;
        }
    }
    return true;
}

04 另类的解法

此解法不那么正规,利用字符串本身的一些方法以及StringBuffer类的reverse()方法来完成判断。先将传入的字符串转为小写,并且去掉空格,然后利用正则,将非字母、数字的其他字符全部替换掉,再利用StringBuffer的reverse()方法,最后判断两字符串是否相等。

public boolean isPalindrome3(String s) {
    if (s == null || s.trim().length() == 0) {
        return true;
    }
    String newString = s.toLowerCase().replace(" ", "").replaceAll("\\W", "");
    String newString2 = new StringBuffer(newString).reverse().toString();
    return newString.equals(newString2);
}

05 测试与验证

对于上面三种方法,编写了部分测试代码,如下:

public static void main(String[] args) {
    Easy_125_ValidPalindrome instance = new Easy_125_ValidPalindrome();
    String arg = "A man, a plan, a canal: Panama";
    long start = System.nanoTime();
    boolean result = instance.isPalindrome(arg);
    long end = System.nanoTime();
    System.out.println("isPalindrome---输入:"+arg+" , 输出:"+result+" , 用时:"+(end-start)/1000+"微秒");

    long start2 = System.nanoTime();
    boolean result2 = instance.isPalindrome2(arg);
    long end2 = System.nanoTime();
    System.out.println("isPalindrome2---输入:"+arg+" , 输出:"+result2+" , 用时:"+(end2-start2)/1000+"微秒");

    long start3 = System.nanoTime();
    boolean result3 = instance.isPalindrome3(arg);
    long end3 = System.nanoTime();
    System.out.println("isPalindrome3---输入:"+arg+" , 输出:"+result3+" , 用时:"+(end3-start3)/1000+"微秒");
}

测试结果如下:

isPalindrome---输入:A man, a plan, a canal: Panama , 输出:false , 用时:191微秒
isPalindrome2---输入:A man, a plan, a canal: Panama , 输出:true , 用时:27微秒
isPalindrome3---输入:A man, a plan, a canal: Panama , 输出:true , 用时:1566微秒

06 小结

此三种解法中最优的是解法二,最差的是解法三,如果笔试或者面试碰到此类题,以第二种解法作答较好。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

电阻基础知识及应用电路仿真(Multisim) 本文围绕硬件工程师必备的电阻知识,从基础知识、实操、应用仿真三方面做系统讲解:基础上明确电阻的核心参数、分类、串并联计算及核心特性;实操中详解贴片/色环电阻的阻值读取、贴片封装换算,重点区分0Ω电阻(贴装跳线,实现功能选通/调试等)与磁珠(高频吸噪)的差异及选型;应用上介绍限流、分压、上拉/下拉、阻抗匹配、过压/过流保护五大典型电路的设计公式、选型原则和实操要点,同时给出电阻通用的选型、测量和布线设计规范,形成完整的电阻应用知识体系。 阅读详情

相关推荐

Unity游戏开发实战:用柏林噪声打造3D随机地形(附完整C#代码)

本文详细介绍了如何在Unity游戏开发中使用柏林噪声算法生成3D随机地形,包含完整的C#代码实现。从基础柏林噪声原理到高级参数控制,再到性能优化和常见问题解决,帮助开发者掌握程序化地形生成技术,打造丰富多变的游戏世界。

weixin_29281941的博客 102

java字符串回文_Java判断字符串回文的代码实例

首先,回文是指类似于“12345”,“abcdcba”的形式,即正念和反念都是一样的字符串判断字符串是否是回文,这边介绍2种办法1、将字符串翻转,判断翻转后的字符串和原字符串是否相等public static void main(String[] args) {String s="abcdcba";// 用StringBuilder的reverse方法将字符串反转StringBuilder sb=...

weixin_35698190的博客 760

LilyPad三色LED共阳极控制:从原理到Arduino编程实战

RGB LED作为可编程光源的核心组件,通过红、绿、蓝三原色的加色混合原理,能够生成丰富的色彩。其内部结构主要分为共阳极和共阴极两种类型,这决定了驱动电路的设计和编程逻辑。在电子织物和可穿戴设备领域,掌握RGB LED的控制技术对于实现动态光效和交互反馈至关重要。本文以LilyPad三色LED为例,深入解析其共阳极特性,并详细演示如何结合Arduino进行PWM编程,从而精准控制颜色与亮度,为智能服装、互动艺术装置等项目提供可靠的照明解决方案。

weixin_30237719的博客 617

数据结构之用堆栈判断回文

回文判断 回文是指正读反读均相同的字符序列,如“abba”和“abdba”均是回文,但“good”不是回文。编写一个程序,使用栈判定给定的字符序列是否为回文。 输入格式: 输入待判断的字符序列,按回车键结束,字符序列长度<20。 输出格式: 若字符序列是回文,输出“YES”;否则,输出“NO”。 输入样例: abdba 解题思路 首先,我们要明白堆栈是具有一定操作约束的线性表,它的特点是只能...

David_house的博客 4246

数据结构——滑动窗口

入:下标为 i 的元素进入窗口,更新相关统计量。如果 i < k−1 则重复第一步更新:更新答案。一般是更新最大值 / 最小值出:下标为 i−k+1 的元素离开窗口,更新相关统计量✔1. 定长子串中元音的最大数目✔2. 找到一个数字的 K 美丽值✔4. 子数组的最大平均数 |方法一:前缀和方法二:滑动窗口7. 得到 K 个黑块的最少涂色次数8. 爱生气的书店老板9. 几乎唯一子数组的最大和10. 长度为 K 子数组中的最大和11. 可获得的最大点数12. 最少交换次数来组合所有的1 ||

qq_68915288的博客 763

基于大模型的急性重症胰腺炎全流程预测与诊疗方案研究

本研究构建了基于大模型的急性重症胰腺炎(SAP)全流程预测与诊疗系统,实现了从术前风险评估到术后康复管理的精准诊疗闭环。通过整合临床信息、实验室检查和影像学等多源数据,模型在测试集上预测准确率达X%,AUC为X,显著优于传统评分系统。研究创新性地将预测结果应用于手术方案制定、麻醉决策、并发症防控及个性化护理,形成智能化诊疗方案。验证结果显示模型具有良好的稳定性和临床适用性,同时配套的健康教育体系提升了患者自我管理能力。尽管存在样本局限性和模型可解释性等不足,该研究为SAP的精准诊疗提供了新范式,未来可通过扩

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1117

java编写程序,实现从键盘输入字符串并显示

程序 public class KeyInput{ //定义一个公开的类,起名KeyInput public static void main(String[] args){ //程序入口 java.util.Scanner s=new java.util.Scanner(System.in); //扫描从键盘输入的内容 System.out.println("请输入内容:"); ...

qq_44420246的博客 5972

毫米波与太赫兹:十射线模型建模

Pt=1,只考虑地面和前后两面墙的反射,反射系数为0.7。用matlab设计程序并实现该功能。,总计考虑10条路径,求出接收功率随。

SupermarketX的博客 788

java string类练习_JavaString类的练习

JavaStringExerciseJavaString类的方法练习1.模拟界面输入:定义人类包含姓名String,年龄int,性别String,体重float,婚姻boolean状况(已婚true,未婚false)。构造函数给成员属性赋值,show方法显示所有成员属性。由控制台输入5个“字符串”作为参数使用构造函数给相应的属性赋值。注意:控制台输入的都是字符串,而属性是各种其他类型!!!!!在调...

weixin_39958911的博客 747

OpenHarmony WiFi子系统全解析:从架构到代码实现(大合集)

头文件路径[相对路径][相对路径][相对路径][相对路径]// 网络配置结构 (wifi_device_config.h)// SSID字符串// 预共享密钥// 安全类型// 网络ID// 优先级// 是否隐藏网络// 扫描信息结构 (wifi_scan_info.h)// SSID// BSSID (MAC地址)// 安全类型int rssi;// 信号强度// 频率// 信道宽度// 时间戳// 连接信息结构 (wifi_linked_info.h)

m0_67505153的博客 1060

8.26华为OD机试真题 新系统 - 仓库查询 (Java/Py/C/C++/Js/Go)

8.26华为OD机试真题 新系统 - 仓库查询 (Java/Py/C/C++/Js/Go)

算法大师! 1745

LeetCode算法题-Valid Palindrome II(Java实现)

这是悦乐书的第287次更新,第304篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680)。给定非空字符串s,最多可以删除一个字符。 判断它是否是回文。例如: 输入:“aba” 输出:true 输入:“abca” 输出:true 说明:可以删除字符“c”让其变为回文。 注意:该字符串仅包含小写字符a-z。 字符串的最大长度为50000。 本次解...

小川的博客 148

AI人工智能 Agent:在仓储物流中的应用

AI人工智能 Agent:在仓储物流中的应用 1. 背景介绍 1.1 问题的由来 仓储物流行业是全球经济运行的基石之一,涉及商品的存储、运输、分拣和配送等多个环节。随着电子商务的普及和消费者对物流速度和精确性的要求不断提高,仓储物流

AGI×大数据,开启智能时代的认知跃迁;解码AGI,赋能数据驱动的智能革命。 864

java ecaf_LeetCode算法题-Valid Palindrome II(Java实现)

这是悦乐书的第287次更新,第304篇原创01 看题和准备今天介绍的是LeetCode算法题中Easy级别的第155题(顺位题号是680)。给定非空字符串s,最多可以删除一个字符。 判断它是否是回文。例如:输入:“aba”输出:true输入:“abca”输出:true说明:可以删除字符“c”让其变为回文。注意:该字符串仅包含小写字符a-z。 字符串的最大长度为50000。本次解题使用的开发工具是e...

weixin_42354972的博客 192

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

LeetCode 125. Valid Palindrome

欢迎访问原文所在博客:https://52heartz.top/articles/leetcode-125-valid-palindrome/ 解答1[Java]: class Solution { private static final char[] charMap = new char[256]; static { for (int i = 0; i <...

user2639的博客 135

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

LeetCode--125. Valid Palindrome

题目链接:https://leetcode.com/problems/valid-palindrome/ 这是一道很简单平常的问题,但是非常的恶心,提交了6次才AC,主要是对alphanumeric characters的理解,它的定义参考https://whatis.techtarget.com/definition/alphanumeric-alphameric。知晓了这个定义就十分轻松了,...

To_be_thinking的博客 155

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【Leetcode】Valid Palindrome

题目链接:https://leetcode.com/problems/valid-palindrome/ 题目: Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. For example, "A man,

业精于勤,荒于嬉 1700

[Leetcode] 125. Valid Palindrome

Problems: https://leetcode.com/problems/valid-palindrome/ Solution: class Solution { public boolean isPalindrome(String s) { // 将字符小写化 String ls = s.toLowerCase(); // 删除不是数字/字...

Renoler的博客 114

LeetCode刷题:125. Valid Palindrome

LeetCode刷题:125. Valid Palindrome 原题链接:https://leetcode.com/problems/valid-palindrome/ Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases. N...

梅森上校的博客 业精于勤荒于嬉,形成于思毁于随。 186

Leetcode之Valid Palindrome(Palindrome 专题)

专题: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 palindrom

396

LeetCode-680. Valid Palindrome II [C++][Java]

Given a strings, returntrueif thescan be palindrome after deletingat most onecharacter from it.

贫道绝缘子的博客 286

【LeetCode-Java实现】125. Valid Palindrome

125. 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 em...

IT Crowd的博客 197

leetcode valid-palindrome(Java)

leetcode题目 valid-palindrome – newcoder 26 验证回文字符串 – leetcode 125 题目描述 * Given a string, determine if it is a palindrome, * considering only alphanumeric(字母或数字) characters and ignoring cases. * For...

聚沙成塔 359

leetcode java开发基础算法(Easy)

Easy 1.TwoSum(easy) /** * 利用map来存储数组中的值以及对应的index,时间复杂度为O(n),空间复杂度为O(n) * 再遍历一次map,如果map中包含有(target-key)的键,则返回这两个键的value,时间复杂度为O(n) * 总的时间复杂度为O(n),空间复杂度为O(n) * @param nums * @param target...

Bug_Solver1996的博客 440
上一篇: LeetCode算法题-Best Time to Buy and Sell Stock II
下一篇: LeetCode算法题-Single Number(Java实现)
程序员小川
博客等级 码龄10年 47粉丝 305原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值