首页 > 其他分享 >力扣-125. 验证回文串

力扣-125. 验证回文串

时间:2024-04-27 19:44:05浏览次数:21  
标签:字符 ++ 复杂度 力扣 while 125 true 回文

1. 题目

题目地址(125. 验证回文串 - 力扣(LeetCode))

https://leetcode.cn/problems/valid-palindrome/

题目描述

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

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

给你一个字符串 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 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

 

提示:

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

2.题解

2.1 首尾双指针(回文)

思路

首先全部小写, 去除非字母字符, 在处理的时候我是直接对于题目给的string进行处理的, 使用了快慢指针的思想, 由于读到的字符总是快于我当前修改的位置,所以直接原地修改即可
然后使用首尾双指针遍历字符串即可!

代码

  • 语言支持:C++

C++ Code:


class Solution {
public:
    void removeExceptAlpha(string& s) {
        int i = 0, j = 0;
        while (j < s.size()) {
            if (isalnum(s[j])) {
                s[i++] = tolower(s[j]);
            }
            j++;
        }
        s.resize(i);
    }
    
    bool isPalindrome(string s) {
        removeExceptAlpha(s);
        int i = 0, j = s.length() - 1;
        while (i < j) {
            if (s[i++] != s[j--]) return false;
        }
        return true;
    }
};

复杂度分析

由于字符串是不可变的, 这里其实空间复杂度没有改变
令 n 为数组长度。

  • 时间复杂度:\(O(n)\)
  • 空间复杂度:\(O(n)\)

2.2 首尾双指针(优化空间复杂度为O(1))

思路

遇到不是字母数字字符, 就向后遍历跳过, 注意这里要防止越界, 判断l < r即可

代码

class Solution {
public:
    bool isPalindrome(string s) {
        int l = 0, r = s.length() - 1;
        while (l < r) {
            while(l < r && !isalnum(s[l])) l++;
            while(l < r && !isalnum(s[r])) r--;
            if(l < r){
                if(tolower(s[l]) != tolower(s[r])) return false;
                l++; r--;
            }
        }
        return true;
    }
};

标签:字符,++,复杂度,力扣,while,125,true,回文
From: https://www.cnblogs.com/trmbh12/p/18162280

相关文章

  • 力扣练习-动态规划
    线性DP3122.使矩阵满足条件的最少操作次数classSolution{/*问题分类:线性DP问题1.每一列元素值相同,相邻列元素值不同,考虑按照列进行状态枚举枚举2.0<=grid[i][j]<=9,值的范围很小只有10个3.f[i][j]可以为考虑前i列并且第i列元素为......
  • 力扣-498. 对角线遍历
    1.题目题目地址(498.对角线遍历-力扣(LeetCode))https://leetcode.cn/problems/diagonal-traverse/题目描述给你一个大小为mxn的矩阵mat,请以对角线遍历的顺序,用一个数组返回这个矩阵中的所有元素。 示例1:输入:mat=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,4,7,5,3,6......
  • 力扣-520. 检测大写字母
    1.题目题目地址(520.检测大写字母-力扣(LeetCode))https://leetcode.cn/problems/detect-capital/题目描述我们定义,在以下情况时,单词的大写用法是正确的:全部字母都是大写,比如"USA"。单词中所有字母都不是大写,比如"leetcode"。如果单词不只含有一个字母,只有首字母大写......
  • 力扣-59. 螺旋矩阵 II
    1.题目题目地址(59.螺旋矩阵II-力扣(LeetCode))https://leetcode.cn/problems/spiral-matrix-ii/题目描述给你一个正整数 n,生成一个包含1到 n2 所有元素,且元素按顺时针顺序螺旋排列的 nxn正方形矩阵matrix。 示例1:输入:n=3输出:[[1,2,3],[8,9,4],[7,6,5]......
  • 力扣-54. 螺旋矩阵
    1.题目题目地址(54.螺旋矩阵-力扣(LeetCode))https://leetcode.cn/problems/spiral-matrix/题目描述给你一个m行n列的矩阵 matrix,请按照顺时针螺旋顺序,返回矩阵中的所有元素。 示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例2:......
  • 力扣-419. 甲板上的战舰
    1.题目题目地址(419.甲板上的战舰-力扣(LeetCode))https://leetcode.cn/problems/battleships-in-a-board/题目描述给你一个大小为mxn的矩阵board表示甲板,其中,每个单元格可以是一艘战舰'X'或者是一个空位'.',返回在甲板board上放置的战舰的数量。战舰只能水平......
  • 力扣-598. 区间加法 II
    1.题目题目地址(598.区间加法II-力扣(LeetCode))https://leetcode.cn/problems/range-addition-ii/题目描述给你一个mx n的矩阵 M和一个操作数组op。矩阵初始化时所有的单元格都为0。ops[i]=[ai,bi]意味着当所有的0<=x<ai和0<=y<bi时,M[x][y]应......
  • 力扣-LCR 126. 斐波那契数
    1.题目题目地址(LCR126.斐波那契数-力扣(LeetCode))https://leetcode.cn/problems/fei-bo-na-qi-shu-lie-lcof/题目描述斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也就是:F(0)=0,F(1)=1F(n......
  • TODO-力扣-707. 设计链表
    1.题目题目地址(707.设计链表-力扣(LeetCode))https://leetcode.cn/problems/design-linked-list/题目描述你可以选择使用单链表或者双链表,设计并实现自己的链表。单链表中的节点应该具备两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果......
  • 力扣-118. 杨辉三角
    1.题目介绍题目地址(118.杨辉三角-力扣(LeetCode))https://leetcode.cn/problems/pascals-triangle/题目描述给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。 示例1:输入:numRows=5输出:[[1],......