[Swift]LeetCode1147. 段式迴文 | Longest Chunked Palindrome Decomposition

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公衆號:山青詠芝(shanqingyongzhi)
➤博客園地址:山青詠芝(https://www.cnblogs.com/strengthen/
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:http://www.javashuo.com/article/p-fxssemoq-kq.html 
➤若是連接不是山青詠芝的博客園地址,則多是爬取做者的文章。
➤原文已修改更新!強烈建議點擊原文地址閱讀!支持做者!支持原創!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★html

Return the largest possible k such that there exists a_1, a_2, ..., a_k such that:git

  • Each a_i is a non-empty string;
  • Their concatenation a_1 + a_2 + ... + a_k is equal to text;
  • For all 1 <= i <= k,  a_i = a_{k+1 - i}

Example 1:github

Input: text = "ghiabcdefhelloadamhelloabcdefghi"
Output: 7
Explanation: We can split the string on "(ghi)(abcdef)(hello)(adam)(hello)(abcdef)(ghi)".

Example 2:微信

Input: text = "merchant"
Output: 1
Explanation: We can split the string on "(merchant)".

Example 3:spa

Input: text = "antaprezatepzapreanta"
Output: 11
Explanation: We can split the string on "(a)(nt)(a)(pre)(za)(tpe)(za)(pre)(a)(nt)(a)".

Example 4:code

Input: text = "aaa"
Output: 3
Explanation: We can split the string on "(a)(a)(a)". 

Constraints:htm

  • text consists only of lowercase English characters.
  • 1 <= text.length <= 1000

段式迴文 其實與 通常回文 相似,只不過是最小的單位是 一段字符 而不是 單個字母。blog

舉個例子,對於通常回文 "abcba" 是迴文,而 "volvo" 不是,但若是咱們把 "volvo" 分爲 "vo"、"l"、"vo" 三段,則能夠認爲 「(vo)(l)(vo)」 是段式迴文(分爲 3 段)。 索引

給你一個字符串 text,在確保它知足段式迴文的前提下,請你返回 段 的 最大數量 k字符串

若是段的最大數量爲 k,那麼存在知足如下條件的 a_1, a_2, ..., a_k

  • 每一個 a_i 都是一個非空字符串;
  • 將這些字符串首位相連的結果 a_1 + a_2 + ... + a_k 和原始字符串 text 相同;
  • 對於全部1 <= i <= k,都有 a_i = a_{k+1 - i}。 

示例 1:

輸入:text = "ghiabcdefhelloadamhelloabcdefghi"
輸出:7
解釋:咱們能夠把字符串拆分紅 "(ghi)(abcdef)(hello)(adam)(hello)(abcdef)(ghi)"。

示例 2:

輸入:text = "merchant"
輸出:1
解釋:咱們能夠把字符串拆分紅 "(merchant)"。

示例 3:

輸入:text = "antaprezatepzapreanta"
輸出:11
解釋:咱們能夠把字符串拆分紅 "(a)(nt)(a)(pre)(za)(tpe)(za)(pre)(a)(nt)(a)"。

示例 4:

輸入:text = "aaa"
輸出:3
解釋:咱們能夠把字符串拆分紅 "(a)(a)(a)"。 

提示:

  • text 僅由小寫英文字符組成。
  • 1 <= text.length <= 1000

8ms
 1 class Solution {
 2     func longestDecomposition(_ text: String) -> Int {
 3         var result = 0
 4         var chars = Array(text)
 5         var n = text.count
 6         var l = ""
 7         var r = ""
 8         for i in 0..<n {
 9             l += String(chars[i])
10             r = String(chars[n-i-1]) + r
11             if l == r {
12                 result += 1
13                 l = ""
14                 r = ""
15             }
16         }
17         return result
18     }
19 }

Runtime: 12 ms

Memory Usage: 20.6 MB
 1 class Solution {
 2     func longestDecomposition(_ text: String) -> Int {
 3         let n:Int = text.count
 4         for i in 0..<(n/2)
 5         {
 6             if text.subString(0, i + 1) == (text.subString(n - 1 - i, n))
 7             {
 8                 return 2 + longestDecomposition(text.subString(i + 1, n - 1 - i))
 9             }
10         }
11         return (n == 0) ? 0 : 1
12     }
13 }
14 extension String {
15     // 截取字符串:指定索引和字符數
16     // - star: 開始索引
17     // - end: 結束索引
18     func subString(_ start:Int,_ end:Int) -> String {
19         let start = self.index(self.startIndex, offsetBy: start)
20         let end = self.index(self.startIndex, offsetBy: end)
21         return String(self[start..<end]) 
22     }
23 }

12ms 
 1 class Solution {
 2     func longestDecomposition(_ text: String) -> Int {
 3         let chars = Array(text)
 4         var l = chars.startIndex
 5         var r = chars.endIndex - 1
 6         let mid = (l + r + 1) / 2
 7         var ans = 0
 8         
 9         while l < r {
10             let range = 0..<mid-l
11             var next  = range.upperBound
12             for i in range where chars[l...l+i] == chars[r-i...r] {
13                 next = i + 1
14                 ans += 2
15                 if l + i + 1 == r - i {
16                     return ans
17                 }else{
18                     break
19                 }
20             }
21             l += next
22             r -= next
23         }
24         return ans + 1
25     }
26 }

16ms

 1 class Solution {
 2     func longestDecomposition(_ text: String) -> Int {
 3         let s = Array(text)
 4         var result = 0
 5         
 6         let end = s.endIndex - 1
 7         var i = s.startIndex
 8         var j = s.startIndex
 9         
10         //ghiabcdefhelloadamhelloabcdefghi
11         while i <= end{
12             while j <= end {
13                 let range1 = i...(i+j)
14                 let range2 = (end-i-j)...(end-i)
15                 j += 1
16                 guard s[range1] == s[range2] else { continue }
17                 result += 1
18                 break
19             }
20         
21             i += j
22             j = 0
23         }
24         return result
25     }
26 }
相關文章
相關標籤/搜索