給定乙個字串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(n2)
// 使用中心擴充套件演算法
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 si==sj)
我們首先初始化一字母和二字母的回文,然後找到所有三字母回文,並依此類推…// 使用動態規劃法
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 ...
最長公共子串行問題 動態規劃法
經常會遇到複雜問題不能簡單地分解成幾個子問題,而會分解出一系列的子問題。簡單地採用把大問題分解成子問題,並綜合子問題的解匯出大問題的解的方法,問題求解耗時會按問題規模呈冪級數增加。為了節約重複求相同子問題的時間,引入乙個陣列,不管它們是否對最終解有用,把所有子問題的解存於該陣列中,這就是動態規劃法所...