# 4037-判断波兰数

# 题目描述

Implement type IsPalindrome<T> to check whether a string or number is palindrome.

For example:

IsPalindrome<'abc'>; // false
IsPalindrome<121>; // true

# 分析

波兰数的本质是判断首尾是否相等。

策略很多,这里仅提供一种思路:

由于字符的匹配要处理的边界场景比较多(由于无法指定剩余字符承接的位置),所以我将字符转成元组,然后通过 T extends [infer F, ...infer M extends string[], infer L] 来进行首尾和中间的匹配。首尾相等,继续遍历,直到为空数组或仅剩一个元素,此时会走 false 逻辑,返回 true 即可。

# 题解

type StringToUnion<T extends string | number> =
  `${T}` extends `${infer F}${infer M}` ? [F, ...StringToUnion<M>] : [];

type Palindrome<T extends string[]> = T extends [
  infer F,
  ...infer M extends string[],
  infer L,
]
  ? F extends L
    ? Palindrome<M>
    : false
  : true;

type IsPalindrome<T extends string | number> = Palindrome<StringToUnion<T>>;

# 知识点

  1. 字符转元组
  2. 元组匹配剩余字符的能力强于字符
Last Updated: 2023/5/16 06:00:28