【leetcode with java】5 Longest Palindromic Substring


【分析】該問題的最優解可以從局部的最優解導出,且計算過程中存在大量重複計算,顯然是要用動態規劃了。
用二維布爾數組mem[][]記錄每個子串是否爲迴文,mem[i][j]表示第i個字符到第j個字符間的子串是否爲迴文。
初始化:當i>=j時mem[i][j] =true, i=j時就一個字符必定爲迴文,i<j時設爲true是爲了當S[i]=S[j]且j=i+1(S表示原字符串)時能夠以j>i+1的情況一樣處理。
過程:若S[i] == S[j]則mem[i][j] = mem[i+1][j-1],否則mem[i][j] = false

【上碼】
/*
 * 最長迴文子串
 * 動態規劃 O(n^2)
 */
public class Solution {
	public String longestPalindrome(String s) {
		
		char[] chars = s.toCharArray();
		int longest = 0, start = 0,end = 0;
		
		int len = s.length();
		boolean[][] mem = new boolean[len][len];
		
		for (int i = 0; i < len; i++) {
			for (int j = 0; j < len; j++) {
				if (i >= j) {
					mem[i][j] = true;
				} else {
					mem[i][j] = false;
				}
			}
		}

		for (int j = 1; j < len; j++) {
			for (int i = 0; i<j; i++) {
				if (chars[i] == chars[j]) {
					mem[i][j] = mem[i+1][j-1];
					
					int currLen = j-i+1;
					if (mem[i][j] == true && longest<currLen) {
						longest = currLen;
						start = i;
						end = j;
					}
					
				}
				else {
					mem[i][j] = false;
				}
			}
		}
		
		return s.substring(start, end+1);
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章