最長回文子串 動態規劃法 中心擴充套件演算法

2021-08-31 03:23:30 字數 1885 閱讀 8863

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。

嗯,回文嘛!就是順序讀取和逆序讀取的結果是一樣的,那我們可以使用兩個for迴圈來不斷的擷取給定的字串s,然後判斷擷取後的字串是不是回文串,與此同時,使用乙個新的字串result來儲存我們擷取到的並且長度最長的回文串。

public string longestpalindrome_reconstructure1(string s)

string result = s.substring(0,1);

string temp = null;

string temp1 = null;

for(int i = 0; i < s.length() - 1; i++)}}

return result;

}

上述**倒是完成了得到最長回文子串的功能,但是,有個很明顯的缺點就是時間開銷太大了,所以肯定得想想辦法減小時間開銷

我們觀察到回文中心的兩側互為映象。因此,回文可以從它的中心展開,並且只有 2n - 1個這樣的中心。

你可能會問,為什麼會是 2n - 1 個,而不是 n個中心?原因在於所含字母數為偶數的回文的中心可以處於兩字母之間(例如 :「abba」 的中心在兩個b之間),時間複雜度也只有o(n​2​​)

// 使用中心擴充套件演算法

public string longestpalindrome_reconstructure2(string s)

int maxlength = 0;

int center = 0;

for (int i = 0; i < s.length(); i++)

}// 如果我們的回文串的長度為偶數,那麼中心左邊的長度會比右邊的長度小1

return s.substring(center - (maxlength - 1) / 2, center + maxlength / 2 + 1);

}int centerexpand(string s, int begin, int end)

// 返回以begin,end為基準,同時向左向右擴充套件後能夠得到的最長回文串長度

return right - left - 1;

}

避免在驗證回文時進行不必要的重複計算。考慮 「ababa」 這個示例。如果我們已經知道 「bab」 是回文,那麼很明顯,「ababa」 一定是回文,因為它的左首字母和右尾字母是相同的。

p(i,j)=(p(i+1,j−1) and s​i​​==s​j​​)

我們首先初始化一字母和二字母的回文,然後找到所有三字母回文,並依此類推…

// 使用動態規劃法

public string longestpalindrome_reconstructure3(string s)

boolean dp = new boolean[s.length()][s.length()]; // 初始化乙個二維陣列,值預設是false

string result = s.substring(0,1);

for (int j = 0; j < s.length(); j++)}}

}return result;

}

最長回文子串 動態規劃法 中心擴充套件演算法

給定乙個字串s,找到s中最長的回文子串。你可以假設s的最大長度為1000。嗯,回文嘛!就是順序讀取和逆序讀取的結果是一樣的,那我們可以使用兩個for迴圈來不斷的擷取給定的字串s,然後判斷擷取後的字串是不是回文串,與此同時,使用乙個新的字串result來儲存我們擷取到的並且長度最長的回文串。publi...

動態規劃法求解最長上公升子串問題

問題描述 給出乙個array的數值 有正有負 給出乙個最長的上公升子串 可以不連續 的長度 定義子狀態 m i m i m i 表示以陣列元素a i a i a i 結尾的最長上公升子串的長度 狀態轉移關係 m j max i a i j m i 1 m j max limits im j i a ...

最長公共子串行問題 動態規劃法

經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是動態規劃法所...