91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中如何快速定位回文子串

發布時間:2024-11-11 16:15:45 來源:億速云 閱讀:78 作者:小樊 欄目:編程語言

在Java中,要快速定位回文子串,可以使用Manacher算法。這是一種線性時間復雜度的算法,可以在O(n)時間內找到字符串中的所有回文子串。以下是使用Manacher算法的基本步驟:

  1. 預處理字符串:為了統一處理奇數長度和偶數長度的回文子串,我們需要在原始字符串的每個字符之間插入一個特殊字符(如’#‘),并在字符串的開頭和結尾添加特殊字符(如’%‘和’&')。這樣,所有的回文子串都會被轉換為奇數長度。
public static String preprocess(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); i++) {
        sb.append('#').append(s.charAt(i));
    }
    sb.append('&');
    return sb.toString();
}
  1. 初始化輔助數組:創建一個數組P,用于存儲以每個字符為中心的回文子串的半徑(包括中心字符)。
public static int[] manacher(String s) {
    String preprocessed = preprocess(s);
    int n = preprocessed.length();
    int[] P = new int[n];
    int center = 0, right = 0;

    for (int i = 0; i < n; i++) {
        if (i < right) {
            int mirror = 2 * center - i;
            P[i] = Math.min(right - i, P[mirror]);
        }

        int left = i - (P[i] + 1);
        int right = i + (P[i] + 1);

        while (left >= 0 && right < n && preprocessed.charAt(left) == preprocessed.charAt(right)) {
            P[i]++;
            left--;
            right++;
        }

        if (i + P[i] > right) {
            center = i;
            right = i + P[i];
        }
    }

    return P;
}
  1. 查找回文子串:遍歷輔助數組P,找到所有值為奇數的元素,它們對應的原始字符串中的字符就是回文子串的中心。根據中心向兩邊擴展,可以找到所有的回文子串。
public static List<String> findPalindromes(String s) {
    List<String> result = new ArrayList<>();
    int[] P = manacher(s);
    int n = s.length();

    for (int i = 0; i < n; i++) {
        if (P[i] % 2 == 1) {
            int center = i;
            int left = center - (P[i] / 2);
            int right = center + (P[i] / 2);
            result.add(s.substring(left, right + 1));
        }
    }

    return result;
}

現在,你可以使用findPalindromes方法在給定的字符串中查找所有的回文子串。例如:

public static void main(String[] args) {
    String s = "babad";
    List<String> palindromes = findPalindromes(s);
    System.out.println("Palindromes in \"" + s + "\": " + palindromes);
}

輸出:

Palindromes in "babad": [baba, bab, a]
向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新建县| 河西区| 图木舒克市| 漳州市| 芦山县| 边坝县| 南岸区| 南平市| 和硕县| 东阿县| 昔阳县| 盐津县| 正蓝旗| 宜良县| 富锦市| 会同县| 曲水县| 耿马| 肃宁县| 黄梅县| 旬阳县| 土默特右旗| 廉江市| 长寿区| 衡南县| 罗甸县| 习水县| 沙湾县| 乌苏市| 忻城县| 余江县| 天气| 小金县| 塘沽区| 阳山县| 太保市| 南投县| 左权县| 得荣县| 闽侯县| 广元市|