小宋爱睡觉 小宋爱睡觉
首页
  • HTML
  • CSS
  • JavaScript
  • Vue
  • React
  • 计算机网络
  • 浏览器原理
  • 性能优化
  • 设计模式
手写系列
  • 字符串
  • 数组
  • 链表
  • 树
  • 动态规划
  • 排序算法
  • GitHub (opens new window)
  • JueJin (opens new window)
首页
  • HTML
  • CSS
  • JavaScript
  • Vue
  • React
  • 计算机网络
  • 浏览器原理
  • 性能优化
  • 设计模式
手写系列
  • 字符串
  • 数组
  • 链表
  • 树
  • 动态规划
  • 排序算法
  • GitHub (opens new window)
  • JueJin (opens new window)
  • 字符串
  • 双指针
    • lc125. 验证回文串
    • lc344. 反转字符串
    • lc647. 回文子串
  • 进制转换
  • 动态规划
  • 字符串
Crucials
2022-02-06

双指针

# 双指针

# lc125. 验证回文串简单

题目描述

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

说明: 本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
1
2
3

示例 2:

输入: "race a car"
输出: false
解释:"raceacar" 不是回文串
1
2
3

思路

正则去掉除了英文以外其他字符,然后双指针前后开始匹配

var isPalindrome = function(s) {
  s = s.replace(/[^\w]|_/g, '').toLowerCase()
  let left = 0, right = s.length - 1
  while(left <= right) {
    if(s[left] === s[right]) {
      left++
      right--
    } else {
      return false
    }
  }
  return true
};
1
2
3
4
5
6
7
8
9
10
11
12
13

# lc344. 反转字符串简单

题目描述

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须 原地 (opens new window)修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]
1
2

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]
1
2
var reverseString = function(s) {
  let left = 0, right = s.length - 1
  while(left <= right) {
    [s[left], s[right]] = [s[right], s[left]]
    left++
    right--
  }
};
1
2
3
4
5
6
7
8

# lc647. 回文子串中等hot

题目描述

给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。

回文字符串 是正着读和倒过来读一样的字符串。

子字符串 是字符串中的由连续字符组成的一个序列。

具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串。

示例 1:

输入:s = "abc"
输出:3
解释:三个回文子串: "a", "b", "c"
1
2
3

示例 2:

输入:s = "aaa"
输出:6
解释:6个回文子串: "a", "a", "a", "aa", "aa", "aaa"
1
2
3

中心扩展

回文串有两种中心形式:

  • 以一个字符为中心(奇数长度)
  • 以两个字符之间为中心(偶数长度)

我们从每个字符/字符对出发向两边扩展,统计回文。

var countSubstrings = function(s) {
    let count = 0;

    const expand = (left, right) => {
        while (left >= 0 && right < s.length && s[left] === s[right]) {
            count++;
            left--;
            right++;
        }
    };

    for (let i = 0; i < s.length; i++) {
        expand(i, i);     // 奇数长度中心
        expand(i, i + 1); // 偶数长度中心
    }

    return count;
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

时间复杂度:O(n^2)

空间复杂度:O(1)

上次更新: 2025/06/04, 10:21:03
字符串
进制转换

← 字符串 进制转换→

Copyright © 2021-2025 粤ICP备2021165371号
  • 跟随系统
  • 浅色模式
  • 深色模式