算法 最长回文子字符串

算法 最长回文子字符串

5.最长回文子串

思路:

  1. 如果字符串的长度小于2,那么就直接返回
  2. 定义两个变量,一个start存储当前找到的最大回文字符串的位置,另一个maxLength记录字符串的长度(终止位置就是start+maxLength)
  3. 创建一个函数helpr function,判断左边和右边是否越界,同时最左边的字符是否等于最右边的字符,如果以上3个条件都满足,则判断是否需要更新回文字符串最大长度及最大字符串的起始位置。然后将left--,right++,继续判断,直到不满足三个条件之一
  4. 遍历字符串,每个位置调用helper遍历两遍,第一遍检查i-1,i+1,第二遍检查i,i+1

回文字符串的长度为奇数,那么就会在i-1,i+1helper调用中得到
回文字符串的长度为偶数,那么就会在i,i+1helper调用中到

/**
 * @param {string} s
 * @return {string}
 */
var longestPalindrome = function (s) {
    if (s.length < 2) return s
    let start = 0
    let maxLength = 1
    var help = function (left, right) {
        while (left >= 0 && right < s.length && s[left] === s[right]) {
            if (right - left + 1 > maxLength) {
                maxLength = right - left + 1
                start = left
            }
            left--
            right++
        }
    }
    for (let i = 0; i < s.length; i++) {
        help(i - 1, i + 1)
        help(i, i + 1)
    }

    return s.substring(start, start + maxLength)

};

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个可能的 Java 程序实现。该程序采用了中心扩展算法,时间复杂度为 O(n^2)。 ```java import java.util.Scanner; public class LongestPalindrome { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.nextLine(); String longestPalindrome = longestPalindrome(s); System.out.println(longestPalindrome); } public static String longestPalindrome(String s) { if (s == null || s.length() < 1) { return ""; } int start = 0, end = 0; for (int i = 0; i < s.length(); i++) { int len1 = expandAroundCenter(s, i, i); int len2 = expandAroundCenter(s, i, i + 1); int len = Math.max(len1, len2); if (len > end - start) { start = i - (len - 1) / 2; end = i + len / 2; } } return s.substring(start, end + 1); } private static int expandAroundCenter(String s, int left, int right) { while (left >= 0 && right < s.length() && s.charAt(left) == s.charAt(right)) { left--; right++; } return right - left - 1; } } ``` 该程序先读入字符串 `s`,然后调用 `longestPalindrome` 方法,返回最长回文字符串。该方法首先判断 `s` 是否为空或长度小于 1,如果是,则返回空字符串。 接着,用两个指针分别从字符串的左右两端开始向中间扩展,检查以当前字符为中心的奇数长度回文和以当前字符和下一个字符为中心的偶数长度回文。用 `Math.max` 方法比较两种回文的长度,如果当前回文长度大于之前找到的最长回文长度,更新起始和结束位置。 最后,返回起始和结束位置之间的字符串,即最长回文字符串
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值