diff --git a/lib/isPalindrome/index.ts b/lib/isPalindrome/index.ts new file mode 100644 index 0000000..09e699d --- /dev/null +++ b/lib/isPalindrome/index.ts @@ -0,0 +1,3 @@ +import { isPalindrome } from "./isPalindrome"; + +export default isPalindrome; diff --git a/lib/isPalindrome/isPalindrome.test.ts b/lib/isPalindrome/isPalindrome.test.ts new file mode 100644 index 0000000..f861b2d --- /dev/null +++ b/lib/isPalindrome/isPalindrome.test.ts @@ -0,0 +1,20 @@ +import { describe, it, expect } from "vitest"; +import { isPalindrome } from "./isPalindrome.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(); + }); +}); diff --git a/lib/isPalindrome/isPalindrome.ts b/lib/isPalindrome/isPalindrome.ts new file mode 100644 index 0000000..1d5df72 --- /dev/null +++ b/lib/isPalindrome/isPalindrome.ts @@ -0,0 +1,30 @@ +function isLetter(c: string) { + if (/\d/.test(c)) return true; + return c.toLowerCase() != c.toUpperCase(); + +} + +export 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; +}; diff --git a/lib/isPalindrome/readme.md b/lib/isPalindrome/readme.md new file mode 100644 index 0000000..70181a4 --- /dev/null +++ b/lib/isPalindrome/readme.md @@ -0,0 +1,104 @@ +# 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. + +## тест кейсы + +## текстовое описание решения + +- я заведу два указателя которые поставлю в начало и в конец и буду двигаться в цикле пока эти указатели не пересекуться +- в цикле я буду получать значение этих двух указателей и проверять если это буква я буду их сравнивать приведя к нижнему регистру +- если они равны я буду двигать указатели дальше +- если они не равны я буду возвращать 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; +}; +``` +