5、最长回文子串

题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。

示例 1:

输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例 2:

输入: “cbbd”
输出: “bb”

很明显可以使用暴力破解,也可以使用动态规划,但是还是马拉车算法比较靠谱,但是我这里只是有了其一半不到的方式,
代码:只超过了近一半的提交
三种方法解决这个问题
动态规划实现的方法
具体的可以看看这个博客
马拉车算法的具体描述,挺详细的,我就直接搬运过来啦

class Solution {
    public String longestPalindrome(String s) {
       if(s.length() == 0 || s.length() == 1){
			return s;
		}
		StringBuilder tem = new StringBuilder("#");
		for (int i = 0; i < s.length(); i++) {
			tem.append(s.charAt(i)).append("#");
		}
	//	System.out.println(tem);
		int start = 0;
		int end = tem.length() - 1;
		int result[] = new int[tem.length()];
		
		result[0] = 1;
		result[tem.length() - 1] = 1;
		for (int i = 1; i < tem.length() -1 ; i++) {
			start = i -1 ;
			end = i + 1;
			while (true) {
				if(start >= 0 && 
					end <= tem.length() - 1 && 
					tem.charAt(start) == tem.charAt(end) ){
					end ++;
					start --;
				}else {
					result[i] = end - start + 1;
					break;	
				}
				
			}
		}
	//	System.out.println(Arrays.toString(result));
		
		//寻找result数组中的最大值,并且记录其下标,注意的是我们寻找的是除了第一个和最后一个的下标
		
		int max = result[1];
		int index = 1;
		for (int i = 0; i < result.length - 1; i++) {
			int j1 = result[i];
			if(j1 > max){
				max = j1;
				index = i;
			}
		}
		//接下来得到数组中的原来元素,得到返回值
		
		//前半部分下标
		start = index - max / 2 + 1;
		
	//	System.out.println("star " + start);
	//	System.out.println("end " + end);
		//后半部分下标
		end = index + max /2 - 1 ;
		StringBuilder temBuilder = new StringBuilder();
		while (start <= end) {
			if(tem.charAt(start) == '#'){
				
			}else {
				temBuilder.append(tem.charAt(start));
			}
			start ++;
		}
		return new String(temBuilder);
         
    }
}

猜你喜欢

转载自blog.csdn.net/qq_34446716/article/details/85884330