题目:

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

本题中,将空字符串定义为有效的 回文串 。

示例 1:

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

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

提示:

1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成

注意:本题与主站 125 题相同:

来源:力扣(LeetCode)
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

一、双指针(原串+双指针【不适用额外的空间】)

①先跳过非数字和非字母的字符

②再定义双指针left和right,从字符串的头和尾进行遍历,遍历过程中将字母统一转换为小写进行判断是否相同,不同直接返回false,遍历结束以后还没有返回,则说明是回文字符串,返回true。

 1 class Solution {
2 public boolean isPalindrome(String s) {
3 int left = 0, right = s.length() - 1;
4 while (left < right){
5 while (left < right && !Character.isLetterOrDigit(s.charAt(left))){
6 left++;
7 }
8 while (left < right && !Character.isLetterOrDigit(s.charAt(right))){
9 right--;
10 }
11 if (left < right){
12 if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))){
13 return false;
14 }
15 left++;
16 right--;
17 }
18 }
19 return true;
20 }
21 }

复杂度:

时间复杂度:O(n),其中n 是字符串s 的长度。

空间复杂度:O(1)。

二、中心扩散法

①先去除多余字符,保留所有的字母和数字,同时保留的时候将大写字母转换为小写字母;

②从中心向两边扩散,注意字符个数奇偶数时,左右指针的位置,最后如果能够到达边界,说明是回文返回true,否则返回false。

 1 class Solution {
2 public boolean isPalindrome(String s) {
3 StringBuilder sb = new StringBuilder();
4 for (int i = 0; i < s.length(); i++){
5 char ch = s.charAt(i);
6 if (Character.isLetterOrDigit(ch)){
7 sb.append(Character.toLowerCase(ch));
8 }
9 }
10 String ans = new String(sb);
11 int len = ans.length();
12 int left = 0, right = 0;
13 //字符串长度为偶数,则刚好对半分
14 //eg:abba
15 if (len % 2 == 0){
16 left = len/2 - 1;
17 right = len/2;
18 }else {
19 //eg:abcba
20 left = len/2 - 1;
21 right = len/2 + 1;
22 }
23 while (left >= 0 && right < len && ans.charAt(left) == ans.charAt(right)){
24 left--;
25 right++;
26 }
27 if (left == -1 && right == len){
28 return true;
29 }
30 return false;
31 }
32 }

剑指 Offer II 018(Java). 有效的回文(简单)的更多相关文章

  1. 剑指Offer——知识点储备-Java基础

    剑指Offer--知识点储备-Java基础 网址来源: http://www.nowcoder.com/discuss/5949?type=0&order=0&pos=4&pa ...

  2. 剑指Offer——栈的java实现和栈的应用举例

    剑指Offer--栈的java实现和栈的应用举例 栈是一种先进后出的数据结构, 栈的实现如下: 首先定义了栈需要实现的接口: public interface MyStack<T> { / ...

  3. 剑指offer题解(Java版)

    剑指offer题解(Java版) 从尾到头打印链表 题目描述 输入一个链表,按从尾到头的顺序返回一个ArrayList. 方法1:用一个栈保存从头到尾访问链表的每个结点的值,然后按出栈顺序将各个值存入 ...

  4. 刷题-力扣-剑指 Offer II 055. 二叉搜索树迭代器

    剑指 Offer II 055. 二叉搜索树迭代器 题目链接 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/kTOapQ 著作权归领扣网络所有 ...

  5. 【剑指 Offer II 001. 整数除法】同leedcode 29.两数相除

    剑指 Offer II 001. 整数除法 解题思路 在计算的时候将负数转化为正数,对于32位整数而言,最小的正数是-2^31, 将其转化为正数是2^31,导致溢出.因此将正数转化为负数不会导致溢出. ...

  6. 剑指offer编程题Java实现——面试题5从头到尾打印链表

    题目描述* 剑指offer面试题5:从尾到头打印链表 输入一个链表的头结点,从尾到头打印出每个结点的值 解决方案一:首先遍历链表的节点后打印,典型的"后进先出",可以使用栈来实现这 ...

  7. 剑指offer面试题-Java版-持续更新

    最近在用Java刷剑指offer(第二版)的面试题.书中原题的代码采用C++编写,有些题的初衷是为了考察C++的指针.模板等特性,这些题使用Java编写有些不合适.但多数题还是考察通用的算法.数据结构 ...

  8. 剑指offer编程题Java实现——面试题10二进制中1的个数

    题目: 请实现一个函数,输入一个整数,输出该整数二进制表示中1的个数.例如,把9表示成二进制是1001,有2位是1,该函数输出2解法:把整数减一和原来的数做与运算,会把该整数二进制表示中的最低位的1变 ...

  9. 剑指offer编程题Java实现——面试题7相关题用两个队列实现一个栈

    剑指offer面试题7相关题目:用两个队列实现一个栈 解题思路:根据栈的先入后出和队列的先入先出的特点1.在push的时候,把元素向非空的队列内添加2.在pop的时候,把不为空的队列中的size()- ...

  10. 剑指offer编程题Java实现——面试题7用两个栈实现队列

    题目:用两个栈实现一个队列.队列的声明如下:请实现他的两个函数appendTail和deleteHead, 分别完成在队列尾部插入节点和在队列头部删除节点的功能. package Solution; ...

随机推荐

  1. C++统计代码运行时间

    本来想自己写的,一看github上面都有就不再重复造轮子了.github上的项目如下: StopWatch 纯标准库实现:使用std::chrono::high_resolution_clock,其实 ...

  2. 基于python的json和cvs格式转换

    一 概念 1 json: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Pr ...

  3. Spring boot返回时间与MySql数据库中不相同问题及解决方法

    最近做项目测试的发现,访问Url返回的时间与数据库中的不相同,环境是Spring boot+MyBatis+Mysql(阿里云服务器),经过一番折腾,得到了解决 问题描述 我是直接使用IDEA的数据库 ...

  4. 四种方式实现点击chrome链接在ie中显示页面

    1.c++ socket通过浏览器在ie中打开指定url github源码:https://github.com/iamzken/cpp-open-ie 2.vb生成exe,url访问exe启动ie并 ...

  5. Spring Boot学习日记6

    @SpringBootConfiguration:SpringBoot的配置 @Configuration: spring配置类 @Component:说明这也是一个spring的组件 @Enable ...

  6. iis管理器界面打不开

    iis管理器界面打不开 图形界面打不开 服务正常运行 开始->运行->输入以下重置下 inetmgr.exe /reset

  7. 三维模型3DTile格式轻量化在网络传输中的重要性分析

    三维模型3DTile格式轻量化在网络传输中的重要性分析 三维模型3DTile格式轻量化在网络传输中扮演了至关重要的角色.随着数字化和虚拟化技术的发展,越来越多的应用需要通过网络来获取和分享大规模三维地 ...

  8. 记录--组件库的 Table 组件表头表体是如何实现同步滚动?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 在使用 Vue 3 组件库 Naive UI 的数据表格组件 DataTable 时碰到的问题,NaiveUI 的数据表格组件 Da ...

  9. APReLU:跨界应用,用于机器故障检测的自适应ReLU | IEEE TIE 2020

    论文的工作属于深度学习在工业界的应用,借鉴计算机视觉的解决方法,针对机器故障检测的场景提出自适应的APReLU,对故障检测的准确率有很大的提升.论文整体思想应该也可以应用于计算机视觉,代码也开源了,大 ...

  10. C++ future

    promise 空模板 非 void 特化,用于在线程间交流对象 void 特化,用于交流无状态事件 类模板 std::promise 提供存储值或异常的设施,之后通过 std::promise 对象 ...