首页 > 其他分享 >[刷题班] LeetCode125. 验证回文串

[刷题班] LeetCode125. 验证回文串

时间:2024-01-14 16:24:37浏览次数:38  
标签:字符 right && charAt Character 刷题 LeetCode125 left 回文

题目描述

思路:左右指针

只考虑数字和字母
字母的话需要全部转化为小写
然后使用左右指针判断是否是回文串

方法一:

class Solution {
    public boolean isPalindrome(String s) {
        List<Character> list = new ArrayList<>();
        for (char c : s.toCharArray()) {
            if (c >= 'A' && c <= 'Z') {
                list.add((char)(c + 32));
            } else if (c >= 'a' && c <= 'z') {
                list.add(c);
            } else if (c >= '0' && c <= '9') {
                list.add(c);
            }       
        } 
        int size = list.size() - 1;
        // 左右指针
        for (int left = 0, right = size; left < right; left ++, right --) {
            if (list.get(left) != list.get(right)) {
                return false;
            }
        }
        return true;
    }
}

时间复杂度:O(n)、空间复杂度:O(n)

方法二:

class Solution {
    public boolean isPalindrome(String s) {
        int left = 0, right = s.length() - 1;
        while (left < right) {
            // 忽略left左边无效字符,在数字和字母字符停下
            while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {
                left ++;
            }
            // 忽略right右边无效字符
            while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {
                right --;
            }

            if (left < right) {
                if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
                    return false;
                }
                left ++;
                right --;
            }
        }
        return true;
    }
}

时间复杂度:O(n)、空间复杂度:O(1)

Character.isLetterOrDigit():判断是否是字母或者数字
Character.toLowerCase():转小写

Character.toLowerCase(char ch) 方法用于将指定的字符参数转换为小写。对于数字字符,它不会有任何影响,即数字字符保持不变。这是因为数字字符在小写和大写之间没有大小写之分。

标签:字符,right,&&,charAt,Character,刷题,LeetCode125,left,回文
From: https://www.cnblogs.com/keyongkang/p/17963831

相关文章

  • [刷题班] LeetCode11. 盛最多水的容器
    题目描述思路:左右指针方法一:暴力,超出时间限制模拟所有情况,记录最大的体积值。体积=Math.min(height[i],height[j])*(j-i)classSolution{publicintmaxArea(int[]height){intres=Integer.MIN_VALUE;for(inti=0;i<height.leng......
  • [刷题班] LeetCode27. 移除元素
    题目描述思路:快慢指针slow指针:其前面都是数值不等于val的元素。fast指针:用于遍历。方法一:classSolution{publicintremoveElement(int[]nums,intval){intslow=0,fast=0;for(;fast<nums.length;fast++){if(nums[fas......
  • [刷题班] LeetCode344. 反转字符串
    题目描述思路:左右指针方法一:classSolution{publicvoidreverseString(char[]s){intleft=0,right=s.length-1;while(left<right){chartemp=s[left];s[left]=s[right];s[right]=temp;......
  • [刷题班] LeetCode80. 删除有序数组中的重复项II
    题目描述思路:快慢指针slow指针指向已经处理元素的下一个位置因为数组有序,如果nums[fast]==nums[slow-2],那么nums[fast]肯定等于nums[slow-1],那么此时这个数就出现了三次。此时slow保持不变,fast继续遍历。关键:nums[fast]!=nums[slow-2]方法一:classSolution{......
  • [刷题班] LeetCode26. 删除有序数组中的重复项
    题目描述思路:快慢指针slow指针:指向已经处理的区域(没有重复元素)的最后一个位置fast指针:指向当前正在处理的元素方法一:classSolution{publicintremoveDuplicates(int[]nums){intslow=0,fast=0;for(;fast<nums.length;fast++){......
  • 算法学习Day26组合总和、分割回文串
    Day26组合总和、分割回文串ByHQWQF2024/01/13笔记39.组合总和给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。解集......
  • 刷题笔记——队列(C++)
    1696.跳跃游戏VI-力扣(LeetCode)给你一个下标从 0 开始的整数数组 nums 和一个整数 k 。一开始你在下标 0 处。每一步,你最多可以往前跳 k 步,但你不能跳出数组的边界。也就是说,你可以从下标 i 跳到 [i+1,min(n-1,i+k)] 包含 两个端点的任意位置。你的目标是......
  • 刷题笔记——栈(C++)
    LCR148.验证图书取出顺序-力扣(LeetCode)现在图书馆有一堆图书需要放入书架,并且图书馆的书架是一种特殊的数据结构,只能按照 一定 的顺序 放入 和 拿取 书籍。给定一个表示图书放入顺序的整数序列 putIn,请判断序列 takeOut 是否为按照正确的顺序拿取书籍的操作序列。你可......
  • 刷题笔记——单向链表(C++)
    206.反转链表-力扣(LeetCode)给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。解题思路三指针。temp指针用于存储当前节点的下一节点,pre指针用于存储当前节点反转后指向的新节点。具体操作如下:反转过程:代码实现classSolution{public:ListNode*reverseList(Li......
  • 刷题笔记——顺序表(C++)
    665.非递减数列-力扣(LeetCode)给你一个长度为 n 的整数数组 nums ,请你判断在 最多 改变 1 个元素的情况下,该数组能否变成一个非递减数列。我们是这样定义一个非递减数列的: 对于数组中任意的 i (0<=i<=n-2),总满足 nums[i]<=nums[i+1]。解题思路遍历数组,计算递......