From e93cc0287ba0a6df22a698aa2b2cbb7d36e44017 Mon Sep 17 00:00:00 2001 From: yanglbme Date: Fri, 25 Aug 2023 19:59:48 +0800 Subject: [PATCH] feat: add solutions to lcof2 problem: No.019 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit No.019.最多删除一个字符得到回文 --- .../README.md" | 97 ++++++++++--------- .../Solution.cpp" | 33 ++++--- .../Solution.java" | 39 ++++---- .../Solution.js" | 6 +- .../Solution.py" | 30 +++--- .../Solution.ts" | 24 ++--- 6 files changed, 120 insertions(+), 109 deletions(-) diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/README.md" "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/README.md" index 8cf127b9d37f3..b6ec1b1399e50 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/README.md" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/README.md" @@ -46,7 +46,14 @@ -双指针,当 `s[i]` 不等于 `s[j]` 时,分别尝试跳过 `i` 或跳过 `j`。 +**方法一:双指针** + +我们用两个指针 $i$ 和 $j$ 分别指向字符串 $s$ 的第一个字符和最后一个字符,然后向中间移动指针,每次判断 $s[i]$ 和 $s[j]$ 是否相等: + +- 如果 $s[i] = s[j]$,则指针 $i$ 向后移动一位,指针 $j$ 向前移动一位; +- 否则,存在两种情况,即删除字符 $s[i]$ 或者删除字符 $s[j]$,然后判断删除之后的字符串是否是回文字符串。即判断子串 $s[i+1..j]$ 或者子串 $s[i..j-1]$ 是否是回文字符串。 + +时间复杂度 $O(n)$,其中 $n$ 是字符串 $s$ 的长度。空间复杂度 $O(1)$。 @@ -57,7 +64,7 @@ ```python class Solution: def validPalindrome(self, s: str) -> bool: - def check(i, j): + def check(i: int, j: int) -> bool: while i < j: if s[i] != s[j]: return False @@ -67,7 +74,7 @@ class Solution: i, j = 0, len(s) - 1 while i < j: if s[i] != s[j]: - return check(i, j - 1) or check(i + 1, j) + return check(i + 1, j) or check(i, j - 1) i, j = i + 1, j - 1 return True ``` @@ -78,16 +85,19 @@ class Solution: ```java class Solution { + private String s; + public boolean validPalindrome(String s) { + this.s = s; for (int i = 0, j = s.length() - 1; i < j; ++i, --j) { if (s.charAt(i) != s.charAt(j)) { - return check(s, i + 1, j) || check(s, i, j - 1); + return check(i + 1, j) || check(i, j - 1); } } return true; } - private boolean check(String s, int i, int j) { + private boolean check(int i, int j) { for (; i < j; ++i, --j) { if (s.charAt(i) != s.charAt(j)) { return false; @@ -98,48 +108,26 @@ class Solution { } ``` -### **TypeScript** - -```ts -function validPalindrome(s: string): boolean { - for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { - return ( - isPalinddrome(s.slice(i, j)) || - isPalinddrome(s.slice(i + 1, j + 1)) - ); - } - } - return true; -} - -function isPalinddrome(s: string): boolean { - for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { - return false; - } - } - return true; -} -``` - ### **C++** ```cpp class Solution { public: bool validPalindrome(string s) { - for (int i = 0, j = s.size() - 1; i < j; ++i, --j) - if (s[i] != s[j]) - return check(s, i + 1, j) || check(s, i, j - 1); - return 1; - } - - bool check(string s, int i, int j) { - for (; i < j; ++i, --j) - if (s[i] != s[j]) - return 0; - return 1; + auto check = [&](int i, int j) { + for (; i < j; ++i, --j) { + if (s[i] != s[j]) { + return false; + } + } + return true; + }; + for (int i = 0, j = s.size() - 1; i < j; ++i, --j) { + if (s[i] != s[j]) { + return check(i + 1, j) || check(i, j - 1); + } + } + return true; } }; ``` @@ -165,6 +153,27 @@ func validPalindrome(s string) bool { } ``` +### **TypeScript** + +```ts +function validPalindrome(s: string): boolean { + const check = (i: number, j: number): boolean => { + for (; i < j; ++i, --j) { + if (s[i] !== s[j]) { + return false; + } + } + return true; + }; + for (let i = 0, j = s.length - 1; i < j; ++i, --j) { + if (s[i] !== s[j]) { + return check(i + 1, j) || check(i, j - 1); + } + } + return true; +} +``` + ### **JavaScript** ```js @@ -173,16 +182,16 @@ func validPalindrome(s string) bool { * @return {boolean} */ var validPalindrome = function (s) { - let check = function (i, j) { + const check = (i, j) => { for (; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { + if (s[i] !== s[j]) { return false; } } return true; }; for (let i = 0, j = s.length - 1; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { + if (s[i] !== s[j]) { return check(i + 1, j) || check(i, j - 1); } } diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.cpp" "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.cpp" index 0e33bc9414af7..0677010d0dcb2 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.cpp" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.cpp" @@ -1,16 +1,19 @@ -class Solution { -public: - bool validPalindrome(string s) { - for (int i = 0, j = s.size() - 1; i < j; ++i, --j) - if (s[i] != s[j]) - return check(s, i + 1, j) || check(s, i, j - 1); - return 1; - } - - bool check(string s, int i, int j) { - for (; i < j; ++i, --j) - if (s[i] != s[j]) - return 0; - return 1; - } +class Solution { +public: + bool validPalindrome(string s) { + auto check = [&](int i, int j) { + for (; i < j; ++i, --j) { + if (s[i] != s[j]) { + return false; + } + } + return true; + }; + for (int i = 0, j = s.size() - 1; i < j; ++i, --j) { + if (s[i] != s[j]) { + return check(i + 1, j) || check(i, j - 1); + } + } + return true; + } }; \ No newline at end of file diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.java" "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.java" index b5935b48e052f..a8379a8fafac2 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.java" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.java" @@ -1,19 +1,22 @@ -class Solution { - public boolean validPalindrome(String s) { - for (int i = 0, j = s.length() - 1; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { - return check(s, i + 1, j) || check(s, i, j - 1); - } - } - return true; - } - - private boolean check(String s, int i, int j) { - for (; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { - return false; - } - } - return true; - } +class Solution { + private String s; + + public boolean validPalindrome(String s) { + this.s = s; + for (int i = 0, j = s.length() - 1; i < j; ++i, --j) { + if (s.charAt(i) != s.charAt(j)) { + return check(i + 1, j) || check(i, j - 1); + } + } + return true; + } + + private boolean check(int i, int j) { + for (; i < j; ++i, --j) { + if (s.charAt(i) != s.charAt(j)) { + return false; + } + } + return true; + } } \ No newline at end of file diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.js" "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.js" index 0b49415f3e812..b5f2e092d4396 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.js" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.js" @@ -3,16 +3,16 @@ * @return {boolean} */ var validPalindrome = function (s) { - let check = function (i, j) { + const check = (i, j) => { for (; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { + if (s[i] !== s[j]) { return false; } } return true; }; for (let i = 0, j = s.length - 1; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { + if (s[i] !== s[j]) { return check(i + 1, j) || check(i, j - 1); } } diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.py" "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.py" index e6c1cee7fb91f..5525f3f1908ad 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.py" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.py" @@ -1,15 +1,15 @@ -class Solution: - def validPalindrome(self, s: str) -> bool: - def check(i, j): - while i < j: - if s[i] != s[j]: - return False - i, j = i + 1, j - 1 - return True - - i, j = 0, len(s) - 1 - while i < j: - if s[i] != s[j]: - return check(i, j - 1) or check(i + 1, j) - i, j = i + 1, j - 1 - return True +class Solution: + def validPalindrome(self, s: str) -> bool: + def check(i: int, j: int) -> bool: + while i < j: + if s[i] != s[j]: + return False + i, j = i + 1, j - 1 + return True + + i, j = 0, len(s) - 1 + while i < j: + if s[i] != s[j]: + return check(i + 1, j) or check(i, j - 1) + i, j = i + 1, j - 1 + return True diff --git "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.ts" "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.ts" index 645dc57312f8f..1481e67171aa1 100644 --- "a/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.ts" +++ "b/lcof2/\345\211\221\346\214\207 Offer II 019. \346\234\200\345\244\232\345\210\240\351\231\244\344\270\200\344\270\252\345\255\227\347\254\246\345\276\227\345\210\260\345\233\236\346\226\207/Solution.ts" @@ -1,19 +1,15 @@ function validPalindrome(s: string): boolean { - for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { - return ( - isPalinddrome(s.slice(i, j)) || - isPalinddrome(s.slice(i + 1, j + 1)) - ); + const check = (i: number, j: number): boolean => { + for (; i < j; ++i, --j) { + if (s[i] !== s[j]) { + return false; + } } - } - return true; -} - -function isPalinddrome(s: string): boolean { - for (let i: number = 0, j = s.length - 1; i < j; ++i, --j) { - if (s.charAt(i) != s.charAt(j)) { - return false; + return true; + }; + for (let i = 0, j = s.length - 1; i < j; ++i, --j) { + if (s[i] !== s[j]) { + return check(i + 1, j) || check(i, j - 1); } } return true;