最长回文子串--Solution 01

最长回文子串

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example 1:

Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.

Example 2:

Input: "cbbd"
Output: "bb"

1. 最基本的解法: 两层遍历.

package com.jackli.solution;

/**
 * @Description: 获取一个字符串的最大回文子序列.
 * @Warning: 假设字符串非空, 且最大长度为 1000.
 * @Author: Jack Li
 * @Package: question005 - LongestPalindrome01
 * @Date: Nov 19, 2019 9:39:20 AM
 * @Version: 1.0.0
 * @TimeComplexity: Required[*] ---- Current[O(n^2)]
 * @ExecuteResult: Success!
 * @Status: Time Limit Exceeded
 */
public class LongestPalindrome01 {
	public static void main(String[] args) {
		System.out.println(longestPalindrome("bb"));
		System.out.println(longestPalindrome("ccc"));
		System.out.println(longestPalindrome("babad"));
		System.out.println(longestPalindrome("cbbd"));
		System.out.println(longestPalindrome("abefkcbbckz"));
		String str = "vaomxdtiuwqlwhgutkhxxhccsgvyoaccuicgybnqnslogtqhblegfudagpxfvjdacsxgevvepuwthdtybgflsxjdmmfumyqgpxatvdypjmlapccaxwkuxkilqqgpihyepkilhlfkdrbsefinitdcaghqmhylnixidrygdnzmgubeybczjceiybowglkywrpkfcwpsjbkcpnvfbxnpuqzhotzspgebptnhwevbkcueyzecdrjpbpxemagnwmtwikmkpqluwmvyswvxghajknjxfazshsvjkstkezdlbnkwxawlwkqnxghjzyigkvqpapvsntojnxlmtywdrommoltpbvxwqyijpkirvndwpgufgjelqvwffpuycqfwenhzrbzbdtupyutgccdjyvhptnuhxdwbmdcbpfvxvtfryszhaakwshrjseonfvjrrdefyxefqfvadlwmedpvnozobftnnsutegrtxhwitrwdpfienhdbvvykoynrsbpmzjtotjxbvemgoxreiveakmmbbvbmfbbnyfxwrueswdlxvuelbkrdxlutyukppkzjnmfmclqpkwzyylwlzsvriwomchzzqwqglpflaepoxcnnewzstvegyaowwhgvcwjhbbstvzhhvghigoazbjiikglbqlxlccrwqvyqxpbtpoqjliziwmdkzfsrqtqdkeniulsavsfqsjwnvpprvczcujihoqeanobhlsvbzmgflhykndfydbxatskf";
		System.out.println(longestPalindrome(str));
		System.out.println(str.length());
	}
	
	/**
	 * Example: "abefkcbbckz" --> "kcbbck"
	 * 
	 * maxLenth: 记录最大回文子串的长度 --> 6
	 * middleIndex: 记录回文子串中间值的 index. 如果子串为偶数位该值为中间较小的 index. --> 6
	 * middleCount: 回文序列中间的值, 如果回文序列为偶数位, 则为中间重复的字符数. --> 2 ("bb")
	 * result: 字符串中的最大回文序列 --> "kcbbck"
	 */
	private static String longestPalindrome(String str) {
		if(str == null || str.length() < 2) {
			return str;
		}
		
		int maxLength = 1; // 至少长度为1
		String result = str.charAt(0) + ""; // 至少是第一个字符
		int middleIndex = 0;
		int middleCount = 1;
		
		// temp variable
		String left, middle, right;
		int len = 0;
		
		for(int i = 0; i < str.length(); i++) {
			// calculate middleCount
			middleCount = 1;
			
			for(int j = 1; j < str.length(); j++) {
				if(i + j < str.length() && str.charAt(i + j) == str.charAt(i)) {
					middleCount++;
				}
				else {
					break;
				}
			}

			if(middleCount != 1 && middleCount > maxLength) {
				// 当中间长度发生变化, 回文序列至少是中间重复的子串.
				result = str.substring(i, i + middleCount);
				maxLength = result.length();
			}
			
			// calculate middle str.  ----> bb
			middle = str.substring(i, i + middleCount);

			for(int j = 1; j <= i; j++) {
				if(i -j < 0 || i + middleCount +j > str.length()) {
					break;
				}
				
				left = str.substring(i - j, i) + middle; // kcbb
				right = new StringBuffer(str.substring(i + middleCount, i + middleCount + j)).reverse() //kc
						+ middle; // kcbb
				
				if(left.equals(right)) {
					// find a palindrome.
					len = j * 2 + middleCount;
					
					if(len > maxLength) {
						maxLength = len;
						result = str.substring(i - j, i + middleCount + j);
					}
				}
			}
		}
		
		return result;
	}
	
}
Result

这仅仅只能完成工作, Commit 后会出现 Time Limit Exceeded 的错误. 这是我们不想看到的.

下一篇, 我们将对此问题进行优化. 思考: 如何能够降低该算法的复杂度呢?


Luck is the name losers give to their own failings.
运气是失败者给自己找的借口.


没过瘾? 关注我获取更多技术干货

扫一扫关注公众号, 加入 QQ 群

我们

一起进步 !

在这里插入图片描述

一个致力于技术交流讨论的技术型 QQ 群

要错过这几百个亿吗?
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值