zoukankan      html  css  js  c++  java
  • [Swift]LeetCode680. 验证回文字符串 Ⅱ | Valid Palindrome II

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
    ➤微信公众号:山青咏芝(shanqingyongzhi)
    ➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/
    ➤GitHub地址:https://github.com/strengthen/LeetCode
    ➤原文地址:https://www.cnblogs.com/strengthen/p/10498380.html 
    ➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
    ➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

    Given a non-empty string s, you may delete at most one character. Judge whether you can make it a palindrome.

    Example 1:

    Input: "aba"
    Output: True 

    Example 2:

    Input: "abca"
    Output: True
    Explanation: You could delete the character 'c'. 

    Note:

    1. The string will only contain lowercase characters a-z. The maximum length of the string is 50000.

    给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。

    示例 1:

    输入: "aba"
    输出: True
    

    示例 2:

    输入: "abca"
    输出: True
    解释: 你可以删除c字符。
    

    注意:

    1. 字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。

    196ms

     1 class Solution {
     2     func validPalindrome(_ s: String) -> Bool {
     3         let chars = Array(s.lowercased().unicodeScalars)
     4         
     5         var start = 0
     6         var end = chars.count - 1
     7         
     8         while start < end {
     9             if chars[start] != chars[end] {
    10                 return validPalindromeRange(chars, i: start + 1, j: end) || validPalindromeRange(chars, i: start, j: end - 1)
    11             }
    12             
    13             start += 1
    14             end -= 1
    15         }
    16         
    17         return true
    18     }
    19     
    20     func validPalindromeRange(_ chars: [Unicode.Scalar], i: Int, j: Int) -> Bool {
    21         var start = i
    22         var end = j
    23         
    24         while start < end {
    25             if chars[start] != chars[end] { return false }
    26             start += 1
    27             end -= 1
    28         }
    29         return true
    30     }
    31 }

    200ms

     1 class Solution {
     2     func validPalindrome(_ s: String) -> Bool {
     3         let array = Array(s)
     4         return isPalindrome(array, 0, array.count - 1)
     5     }
     6     
     7     fileprivate func isPalindrome(_ array: [Character], _ i: Int, _ j: Int, alreadyRemoved: Bool = false) -> Bool {
     8         var i = i, j = j
     9         while i < j {
    10             if array[i] != array[j] {
    11                 if alreadyRemoved {
    12                     return false
    13                 } else {
    14                     return isPalindrome(array, i + 1, j, alreadyRemoved: true) || 
    15                            isPalindrome(array, i, j - 1, alreadyRemoved: true)
    16                 }
    17             } else {
    18                 i += 1
    19                 j -= 1
    20             }
    21         }
    22         return true
    23     }
    24 }

    204ms

     1 class Solution {
     2     func validPalindrome(_ s: String) -> Bool {
     3 
     4         var s = Array(s)
     5         var i = 0, j = s.count - 1
     6 
     7         while i < j {
     8             if s[i] == s[j] {
     9                 i += 1
    10                 j -= 1
    11             } else {
    12                 return isValid(s, i, j - 1) || isValid(s, i + 1, j)
    13             }
    14         }
    15 
    16         return true
    17     }
    18 
    19     func isValid(_ s: [Character], _ i: Int, _ j: Int) -> Bool {
    20 
    21         let mid = (i + j) / 2
    22 
    23         for k in i...mid {
    24             if s[k] != s[j - (k - i)] {
    25                 return false
    26             }
    27         }
    28         return true
    29     }
    30 }

    Runtime: 224 ms
    Memory Usage: 20.1 MB
     1 class Solution {
     2     func validPalindrome(_ s: String) -> Bool {
     3         var arr:[Character] = Array(s)
     4         var left:Int = 0
     5         var right:Int = arr.count - 1
     6         while (left < right)
     7         {
     8             if arr[left] != arr[right]
     9             {
    10                  return isValid(arr, left, right - 1) || isValid(arr, left + 1, right)
    11             }
    12             left += 1
    13             right -= 1
    14         }
    15         return true
    16     }
    17     
    18     func isValid(_ arr:[Character],_ left:Int,_ right:Int) -> Bool
    19     {
    20         var left = left
    21         var right = right
    22         while (left < right)
    23         {
    24             if arr[left] != arr[right]
    25             {
    26                 return false
    27             }
    28             left += 1
    29             right -= 1
    30         }
    31         return true
    32     }
    33 }

    232ms

     1 class Solution {
     2     func validPalindrome(_ s: String) -> Bool {
     3         let stringArray = Array(s.utf16)
     4         if stringArray.count == 1 || stringArray.count == 2 {return true}
     5         var i = 0
     6         var j = stringArray.count - 1
     7         var alreadyRemoved = false
     8         
     9         while i < j {
    10             if stringArray[i] != stringArray[j] { 
    11                 if alreadyRemoved {return false}
    12                 
    13                 if i+2 < j-1, stringArray[i+1] == stringArray[j],
    14                 stringArray[i+2] == stringArray[j-1] {
    15                     i += 1
    16                     alreadyRemoved = true
    17                 } else if i+2 >= j-1, stringArray[i+1] == stringArray[j] {
    18                     i += 1
    19                     alreadyRemoved = true
    20                 } else if stringArray[i] == stringArray[j-1], stringArray[i+1] == stringArray[j-2] {
    21                     j -= 1
    22                     alreadyRemoved = true
    23                 } else {
    24                     return false
    25                 }
    26                 
    27                 
    28             }
    29             i += 1
    30             j -= 1        
    31         }            
    32         return true
    33     }
    34 }

    244ms

     1 class Solution {
     2     func validPalindrome(_ s: String) -> Bool {
     3         return s.isPalindrome
     4     }
     5 }
     6 
     7 extension String {
     8     
     9     var isPalindrome: Bool {
    10         let array = Array(self)
    11         return isPalindrome(array, 0, array.count-1)
    12     }
    13     
    14     private func isPalindrome(_ array: [Character], _ i: Int, _ j: Int, _ isAlreadyMismatched: Bool = false) -> Bool {
    15         var left = i, right = j
    16         while left < right {
    17             if array[left] != array[right] {
    18                 return isAlreadyMismatched ? false : (isPalindrome(array, left, right-1, true) || isPalindrome(array, left+1, right, true))
    19             }
    20             
    21             left+=1
    22             right-=1
    23         }
    24         
    25         return true
    26     }
    27 }
  • 相关阅读:
    自制游戏Zombie代码
    HNOI2020总结
    20200615题解:继续扮演
    20200611题解:树网的核
    历次考试总结
    寒假总结和省选大体规划
    每日总结
    有一种感动叫ACM(记WJMZBMR在成都赛区开幕式上的讲话)
    递推求欧拉函数的最简单的详解
    总结一些好用的C++小技巧
  • 原文地址:https://www.cnblogs.com/strengthen/p/10498380.html
Copyright © 2011-2022 走看看