# isPalindrome

## описание задачи

A phrase is a palindrome if, after converting all uppercase letters into lowercase letters and removing all non-alphanumeric characters, it reads the same forward and backward. Alphanumeric characters include letters and numbers.

Given a string s, return true if it is a palindrome, or false otherwise.

Example 1:

- Input: s = "A man, a plan, a canal: Panama"
- Output: true
- Explanation: "amanaplanacanalpanama" is a palindrome.

Example 2:

- Input: s = "race a car"
- Output: false
- Explanation: "raceacar" is not a palindrome.

Example 3:

- Input: s = " "
- Output: true
- Explanation: s is an empty string "" after removing non-alphanumeric characters. Since an empty string reads the same forward and backward, it is a palindrome.
 

Constraints:

- `1 <= s.length <= 2 * 105`
- s consists only of printable ASCII characters.

## тест кейсы

```ts
describe("isPalindrome", () => {
  it("A man, a plan, a canal: Panama => true", () => {
    expect(isPalindrome("A man, a plan, a canal: Panama")).toBeTruthy();
  });

  it("race a car => false", () => {
    expect(isPalindrome("race a car")).toBeFalsy();
  });

  it(" _ => true", () => {
    expect(isPalindrome(" ")).toBeTruthy();
  });

  it(" 0P => false", () => {
    expect(isPalindrome("0P")).toBeFalsy();
  });
});
```

## текстовое описание решения

- я заведу два указателя которые поставлю в начало и в конец и буду двигаться в цикле пока эти указатели не пересекуться
- в цикле я буду получать значение этих двух указателей и проверять если это буква я буду их сравнивать приведя к нижнему регистру
- если они равны я буду двигать указатели дальше
- если они не равны я буду возвращать false
- перед сравнением нужно проверить что оба символа у меня буквы по условию задачи
- если один из указателей не буква я буду двигать этот указатель пока не встречу букву
- для проверки буква это или нет я заведу вспомогательную функцию в которой буду текущий символ приводить к нижнему и верхнему регистру  и сравнивать если их значения не равны значит это буква

## ассимптотическая оценка

| Description | Estimation |
| ----------- | ---------- |
| time:       | O(n)     |
| mem:        | O(n)     |

## time

| Description                                 | Time  |
| ------------------------------------------- | ----- |
| анализ и сбор информации                    | 04:18 |
| обдумываение решения и формулировка решения | 05:40 |
| имплементация                               | 10:14 |
| исправление ошибок                          | 36:12 |
| полное время затраченое на решение          | 17:03 |

## журнал ошибок

- забыл инкрементировать и декрементировать указатели
- не учел числа
- поправил числа слетел первый кейс
- заменил проверку чисел на регулярное выражение

## code

### typescript

```ts
function isLetter(c: string) {
  if (/\d/.test(c)) return true;
  return c.toLowerCase() != c.toUpperCase();
}

function isPalindrome(s: string): boolean {
  let L = 0;
  let R = s.length - 1;

  while (L <= R) {
    let lChar = s[L].toLowerCase();
    let rChar = s[R].toLowerCase();

    if (!isLetter(lChar)) {
      L++;
      continue;
    }
    if (!isLetter(rChar)) {
      R--;
      continue;
    }

    if (lChar !== rChar) return false;
    L++;
    R--;
  }

  return true;
};
```
