首页 > 编程语言 >剑指 Offer II 018(Java). 有效的回文(简单)

剑指 Offer II 018(Java). 有效的回文(简单)

时间:2023-05-24 15:13:33浏览次数:55  
标签:right Java charAt Offer Character len II 回文 left

题目:

给定一个字符串 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 }

 

标签:right,Java,charAt,Offer,Character,len,II,回文,left
From: https://www.cnblogs.com/liu-myu/p/17427930.html

相关文章

  • 【JavaWeb-02】Web服务器
    文章目录2.web服务器2.1技术讲解2.2web服务器2.web服务器2.1技术讲解JSP/Servlet:B/S:浏览和服务器C/S:客户端和服务端sun公司主推的B/S架构基于Java语言的(所有的大公司,或者一些开源的组件,都是用Java写的)可以承载三高问题带来的影响2.2web服务器IIS:微软的Tmocat:Java初学人员......
  • 京东数科java一面【过】
    自我介绍实习经历【聊了挺多】集合方面Collection【list(写时复制)/set/Queue(阻塞队列)】Map【HashTable/HashMap/ConcorrentHashMap】synchronized对象头原理的过程A系统1WTBS,B系统300TBS,问解决方法技术角度:读写分离、Kong层、加服务器业务角度:加锁、加进度条AQS是什么原理Volat......
  • 【剑指offer】-栈的压入、弹出序列-20/67
    1.题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的......
  • 阿里蚂蚁集团Java一面【凉】
    一个小哥哥打来的电话1.自我介绍2.介绍实习实习的时候用到了分布式锁深挖分布式锁的实现【回去复盘】遇到了什么问题?为什么用这个?怎么用的?怎么实现?3.多服务器之间是怎么保持数据一致的【回去复盘】4.分布式事务5.微服务了解嘛【回去复盘】6.MySQL的索引7.MySQL的乐观锁......
  • 【从Java转C#】第三章:对象和类型
    目录对象和类型ref和out参数的使用方法的重载属性构造函数匿名类型结构【Struct】弱引用(WeakReference)静态类Object对象和类型ref和out双方都可以改变原始的地址初始值的不同ref:需要赋予变量初始值out:不需要赋予变量初始值namespaceConsoleApp1{classProgram{......
  • 【剑指offer】-把二叉树打印成多行-43/67
    1.题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。2.题目分析非常经典的一道二叉树的题目,做这道题之前需要掌握二叉树的思想和BFS(广度优先搜索、队列思想)我们可以回顾一下最基本的层次遍历,我们是用一个队列来进行存储初始root结点,然后依次放入root的......
  • 【剑指offer】- 求1+2+3+...+n -47/67
    1.题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。2.题目分析对于这种求1+2+3+…+n的题,我们可以采取3中方法第一种:直接利用等差数列的思想来进行求和return(1+n)*n/2;第二种:利用迭代的思想进行求和intres=......
  • 【剑指offer】- 数组中重复的数字 -48/67
    1.题目描述在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例1:输入:[2,3,1,0,2,5,3]输出:2或32.题目分析此题考查的是面试者的沟通能力,......
  • Day02-关于java的基础知识
    关于java的基础知识java的特性和优势简单性面向对象可移植性高性能分布式动态性多线程安全性健壮性 JDK、JRE、JVMJDK:JavaDevelopmentkit(java开发工具)JRE:JavaRuntimeEnvironment(java运行时环境)JVM:JavaVirtualMachine(java虚拟机)......
  • 学习日记——初识Java
    1.什么是JavaJava的定义:一种程序编程语言,可以发布一系列有序指令来指挥机器工作Java的发展:1995年诞生,Java之父-高斯林Java目前应用比较多的版本:JavaSE7(2011年)JavaSE8(2014年)学习Java的原因:Java是高级编程语言,并且是很多领域的基础学科2.创建项目①Java环境配......