成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

獲取最長回文子串

ymyang / 2075人閱讀

摘要:以下是最長回文子串的相關(guān)代碼,相關(guān)邏輯已在注釋中注明我們原有的字符串可能存在兩種回文子串,一種是具有基數(shù)個元素例如一種是具有偶數(shù)個元素例如這樣的話分情況判斷比較復(fù)雜所以我們對原字符串進行擴充在相鄰元素中插入特殊值插入后的原基數(shù)回文子串變成了

以下是最長回文子串的Manacher‘s Algorithm相關(guān)代碼,相關(guān)邏輯已在注釋中注明:

public static String solution(String s) {
    if (s.length() == 0) {
        return "";
    }
    //我們原有的字符串可能存在兩種回文子串,一種是具有基數(shù)個元素例如aba 一種是具有偶數(shù)個元素例如abba 這樣的話分情況判斷比較復(fù)雜
    //所以我們對原字符串進行擴充 在相鄰元素中插入特殊值 插入后的原基數(shù)回文子串變成了#a#b#a# 原偶數(shù)回文子串變成了#a#b#b#a# 都變成了基數(shù)回文子串 便于后續(xù)的運算
    char[] chars = new char[s.length() * 2 + 1];
    for (int i = 0; i < s.length(); i++) {
        chars[2 * i] = "#";
        chars[2 * i + 1] = s.charAt(i);
    }
    chars[chars.length - 1] = "#";
    //初始化標(biāo)識數(shù)組,此數(shù)組用來表示chars中某個元素的回文子串半徑值
    int[] l = new int[chars.length];
    l[0] = 1;
    //其中max為已探明的回文子串中能擴展到最右的邊界位置 id為前述回文子串的中心位置 resid為最終解的中心值
    int max = 1, id = 0, resid = 0;
    //循環(huán)獲取最長回文子串
    for (int i = 1; i < l.length; i++) {
        // 當(dāng)max>i時當(dāng)前數(shù)組為如下結(jié)構(gòu):
        //  beg-------min----j-----id-----i----max-----end
        //其中beg和end分別為數(shù)組的邊界位置 j=2*id-i 是i對于id的對稱值 (當(dāng)max>i時此對稱值肯定會有并且肯定大于min,當(dāng)max i ? Math.min(l[2 * id - i], max - i) : 1;
        //對獲取的半徑進行迭代擴充回文序列的長度
        while (i - l[i] >= 0 && i + l[i] <= chars.length - 1 && chars[i - l[i]] == chars[i + l[i]]) {
            l[i]++;
        }
        //如果當(dāng)前的回文序列最右邊界位置已經(jīng)大于了max 則更新max和id為當(dāng)前回文序列的相關(guān)值
        if (i + l[i] - 1 > max) {
            max = i + l[i] - 1;
            id = i;
        }
        //如果當(dāng)前的回文序列長度為最長,則更新resid的值
        if (l[i] > l[resid]) {
            resid = i;
            //如果當(dāng)前的回文序列長度和之前記錄的最長回文序列的長度相同則存在如下情況:
            // 1、之前最長回文序列長度為1 但是此時中心為擴充值 比如a#b中 #為中心 長度為1 這樣的序列并不能當(dāng)作解來使用,如果發(fā)現(xiàn)了以原字符串中字符為中心的長度相同的串則要更新這個值
            // 2、之前最長回文序列中心值為擴充值,例如#a#a#長度為5對應(yīng)原字符串中子串為aa,但是存在以原字符串的值為中心的序列比如a#b#a 長度為5,此時對應(yīng)的原字符串為aba 可見長度相同但是最后的結(jié)果有差別
            // 所以此處進行判斷來避免如上兩種問題
        } else if (l[i] == l[resid] && resid % 2 == 0) {
            resid = i;
        }
    }
    StringBuilder sb = new StringBuilder();
    int resBeg = resid - l[resid] + 1;
    //根據(jù)得到的resid和其半徑 獲取最后的結(jié)果
    while (resBeg <= resid + l[resid] - 1) {
        if (resBeg % 2 == 1) {
            sb.append(chars[resBeg]);
        }
        resBeg++;
    }
    return sb.toString();
}

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/77845.html

相關(guān)文章

  • 最長回文子串——Manacher 算法

    摘要:問題定義最長回文子串問題給定一個字符串,求它的最長回文子串長度??梢圆捎脛討B(tài)規(guī)劃,列舉回文串的起點或者終點來解最長回文串問題,無需討論串長度的奇偶性。 0. 問題定義 最長回文子串問題:給定一個字符串,求它的最長回文子串長度。 如果一個字符串正著讀和反著讀是一樣的,那它就是回文串。下面是一些回文串的實例: 12321 a aba abba aaaa tatt...

    mingzhong 評論0 收藏0
  • Leetcode 5 Longest Palindromic Substring 最長回文子串

    摘要:難度題目是說給出一個字符串求出這個字符串的最長回文的子串回文是指前后完全對稱的字符串像是之類的都算是回文奇數(shù)字母的回文和偶數(shù)字母的回文中心是不一樣的奇數(shù)字母比如的中心在中間字母上偶數(shù)字母比如的回文在中間兩字母的中心上由此可見回文中心點實際上 Given a string s, find the longest palindromic substring in s. You may as...

    NotFound 評論0 收藏0
  • LeetCode.5 最長回文子串(longest-palindromic-substring)(J

    摘要:一題目最長回文子串給定一個字符串,找到中最長的回文子串。你可以假設(shè)的最大長度為。示例輸入輸出注意也是一個有效答案。 一、題目 最長回文子串: 給定一個字符串 s,找到 s 中最長的回文子串。你可以假設(shè) s 的最大長度為 1000。 示例 1: 輸入: babad輸出: bab注意: aba 也是一個有效答案。 示例 2: 輸入: cbbd輸出: bb 二、我的答案 思路 1.排...

    Steven 評論0 收藏0
  • LeetCode5.最長回文子串 JavaScript

    摘要:最長回文子串給定一個字符串,找到中最長的回文子串。你可以假設(shè)的最大長度為。示例輸入輸出注意也是一個有效答案。 LeetCode5.最長回文子串 JavaScript 給定一個字符串 s,找到 s 中最長的回文子串。你可以假設(shè) s 的最大長度為 1000。示例 1: 輸入: babad 輸出: bab 注意: aba 也是一個有效答案。 示例 2: 輸入: cbbd輸出: bb /*...

    philadelphia 評論0 收藏0
  • 最長回文子串

    摘要:給定一個字符串,找到中最長的回文子串。你可以假設(shè)的最大長度為。示例輸入輸出注意也是一個有效答案。 給定一個字符串 s,找到 s 中最長的回文子串。你可以假設(shè) s 的最大長度為 1000。 示例 1: 輸入: babad輸出: bab注意: aba 也是一個有效答案。 示例 2: 輸入: cbbd輸出: bb 用的Manacher算法 var longestPalindrome = fu...

    jemygraw 評論0 收藏0

發(fā)表評論

0條評論

ymyang

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<