美文网首页工作生活
iOS最长回文子串算法(Swift)

iOS最长回文子串算法(Swift)

作者: huxinwen | 来源:发表于2019-07-03 17:18 被阅读0次

描述

给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。

示例 2:

输入: "cbbd"
输出: "bb"

思路

从第二个元素开始遍历,分三种情况查找,分别是:

  1. 当前位置元素跟右边相邻的位置元素为中心,向两边扩开查找;
  2. 当前位置元素跟左边相邻的位置元素为中心,向两边扩开查找;
  3. 当前位置元素为中心,向两边扩开查找。查找的过程中,比较查找到的最大回文子串的长度和剩下元素中可能存在最大回文长度,决定是否需要继续查找,去掉不必要的重复。
class Solution {
    func longestPalindrome(_ s: String) -> String {
        let strA = Array(s)
        if s.count == 0 {return ""}
        let count = s.count
        var maxL = 0 ///最长回文长度
        var cache :[Int:(Int , Int)] = [:]///最长回文对应的长度为key,开始结束下标元组为value
        
        
        var i = 1
        
        while i < count {
            if maxL >= min(i*2, (count - i)*2) {///最长回文长度大于剩下可能最长回文,结束查找
                
                break
            }
            var left = 0
            var right = 0
            
                
            if i+1 < count && strA[i] == strA[i+1]{//当前位置元素跟右边相邻的位置元素为中心,向两边扩开查找
                left = i
                right = i+1
                while left >= 0 && right < count && strA[left] == strA[right]{
                    if maxL < right - left{
                        cache.removeValue(forKey: maxL)
                        maxL = right - left
                        cache[maxL] = (left , right)
                        
                    }
                    left -= 1
                    right += 1
                }
            }
            if i-1 >= 0 && strA[i-1] == strA[i]{//当前位置元素跟左边相邻的位置元素为中心,向两边扩开查找
                if maxL >= min(i*2, (count - i)*2) {///最长回文长度大于剩下可能最长回文,结束此轮查找
                     i += 1
                    continue
                }
                left = i-1
                right = i
                while left >= 0 && right < count && strA[left] == strA[right]{
                    if maxL < right - left{
                        cache.removeValue(forKey: maxL)
                        maxL = right - left
                        cache[maxL] = (left , right)
                        
                    }
                    left -= 1
                    right += 1
                }
            }
            if i+1 < count && i-1 >= 0 && strA[i-1] == strA[i+1] {//当前位置元素为中心,向两边扩开查找
                if maxL >= min(i*2, (count - i)*2) {///最长回文长度大于剩下可能最长回文,结束此轮查找
                     i += 1
                    continue
                }
                left = i-1
                right = i+1
                while left >= 0 && right < count && strA[left] == strA[right]{
                    if maxL < right - left{
                        cache.removeValue(forKey: maxL)
                        maxL = right - left
                        cache[maxL] = (left , right)
                        
                    }
                    left -= 1
                    right += 1
                }
            }
           
            i += 1
        }
        
        let left = cache[maxL]?.0
        let right = cache[maxL]?.1
        let leftI = s.index(s.startIndex, offsetBy: left ?? 0)
        let rightI = s.index(s.startIndex, offsetBy: right ?? 0)
        
        return String(s[leftI...rightI])
        
    }
}

最长回文子串

相关文章

  • 文章收藏

    iOS面试题系列之常见算法 排序算法整理 字符串【3】最长回文子串【3】最长无重复子串【1*】字符串转数字【4】K...

  • iOS最长回文子串算法(Swift)

    描述 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。 示例 1: 输入:...

  • 最长回文子串

    最长回文子串——Manacher 算法 1. 问题定义 最长回文字符串问题:给定一个字符串,求它的最长回文子串长度...

  • Manacher's Algorithm算法分析Java

    Manacher's Algorithm俗称马拉车算法,对于求字符串中最长回文子串效率极高。 在求最长回文子串的时...

  • 最长回文子串问题—Manacher算法

    最长回文串问题是一个经典的算法题。 0. 问题定义 最长回文子串问题:给定一个字符串,求它的最长回文子串长度。如果...

  • 《最长回文子串》

    python算法题之《最长回文子串》 题目要求 代码及解析 结果

  • iOS面试题汇总---算法类

    字符串 【3】最长回文子串 【3】最长无重复子串 【1*】字符串转数字 【4】KMP 算法 【2】字符串全排列 【...

  • 经典算法问题:最长回文子串之 Manacher 算法

    title: 经典算法问题:最长回文子串之 Manacher 算法date: 2019-02-17 08:00:0...

  • 面经准备

    算法 1,最长回文子串https://www.cnblogs.com/mini-coconut/p/9074315...

  • 字符串算法

    最长公共前缀 最长回文串 最长回文子序列 最长公共子串 反转单词顺序列 反转字符串 字符串转数字 IP-int互转

网友评论

    本文标题:iOS最长回文子串算法(Swift)

    本文链接:https://www.haomeiwen.com/subject/caechctx.html