最長迴文子串

問題描述:給定一個字符串S,找出它的最長迴文子串。

Input: "babad"

Output: "bab"

Note: "aba" is also a valid answer.

 

Input: "cbbd"

Output: "bb"

 

思路:可以採用動態規劃思想,定義dp[i][j]爲

 dp[i][j]=  true (如果子串 Si…Sj 是一個迴文串)

           =  false(如果子串 Si…Sj 不是一個迴文串)

於是可得dp[ i ] [ j ] = (dp[ i+1 ][ j-1 ] && S[ i ]==S[ j ]),即如果Si+1…Sj-1是一個迴文串且 S[ i ]==S[ j ],那麼Si…Sj 是一個迴文串。dp數組的初始值爲:

dp(i,i)=true

dp(i,i+1)=true  if (Si==Si+1)

C++語言代碼如下:

                bool dp[s.length()][s.length()]={false};
		for(int i=0;i<s.length();++i){
			dp[i][i]=true;
			if(i<s.length()-1&&s[i]==s[i+1])
				dp[i][i+1]=true;
		}
		for(int i=s.length()-1;i>0;--i){
			for(int j=i;j<s.length()-1;++j){
				if(dp[i][j]&&s[i-1]==s[j+1]){
					dp[i-1][j+1]=true;
				}
			}
		}
		int maxlength=0;
		for(int i=0;i<s.length();++i){
			for(int j=i;j<s.length();++j){
				if(maxlength<j-i+1)
					maxlength=j-i+1;
			}
		}
		return maxlength;

 

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