5LongestPalindromicSubstring

题意:输入一个字符串S,找到S中最长的回文子串,题目简化为S的最大长度为1000且只存在唯一的最长回文子串。

思路:回文串指正着读反着读结果相同,如“cabac”,以每个位置(回文长度为奇数),两个位置的中间位置(回文长度为偶数),比较回文长度,找到长度最大的回文串(下标start, end表示)。参考https://leetcode.com/articles/longest-palindromic-substring/

    public String longestPalindrome(String s) {
    	int start = 0, end = 0;
    	for(int i = 0; i < s.length(); i++){ //O(n^2)
    		int len1 = expandAroundCenter(s, i, i); //回文是奇数
    		int len2 = expandAroundCenter(s, i, i+1); //回文是偶数
    		int len = Math.max(len1, len2); //局部的
    		if(len > end - start){ //全局的,使用subString(s, start, end+1)
    			start = i - (len - 1) / 2;
    			end = i + len / 2;
    		}
    	}
    		return s.substring(start, end+1); //[start, end+1)
    }
    
	private int expandAroundCenter(String s, int cLeft, int cRight) {
		int L = cLeft, R = cRight;
		while(L >= 0 && R < s.length() && s.charAt(L) == s.charAt(R)){ //O(2cLeft) < O(n/2)
			L--;
			R++;
		}
		return (R - L - 1); //(R-1)-(L+1)+1
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值