# 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>>;
# 知识点
- 字符转元组
- 元组匹配剩余字符的能力强于字符