每日一題2.最長迴文串

leetcode刷題筆記新地址(仍在更新)

https://github.com/MyLinChi/LeetcodeNote

問題描述

給定一個字符串 s,找到 s 中最長的迴文子串。你可以假設 s 的最大長度爲 1000。

示例 1:
輸入: “babad”
輸出: “bab”
注意: “aba” 也是一個有效答案。
示例 2:
輸入: “cbbd”
輸出: “bb”

問題分析

要判斷一個字符串是不是迴文串有點難,但如果知道它的字串是迴文串,再結合新進去的字符是否符合要求,就可以只考慮當前狀態而做出決策,也就是動態規劃。
假設ss表示輸入的字符串,s[i]s[i]表示s的第i個字符(從0開始),FijF_{ij}表示s[i]...s[j]s[i]...s[j]是否爲迴文串,若是則值爲1否則爲0。那麼可以寫出狀態轉移方程
Fij=F(i+1)(j1)&&s[i]==s[j]F_{ij} = F_{(i+1)(j-1)}\&\&s[i]==s[j]
Fii=1(i=1,2,...,s.lengh)F_{ii} = 1 (i = 1,2,...,s.lengh)
Φ=1()\Phi = 1(令空串也是迴文串)

代碼

#include<iostream>
#include<string>
using namespace std;

class Solution {
public:
	char dp[1000][1000];
	int index, lenMax;
	string longestPalindrome(string s) {
		int len, i, j;
		for (len = 2; len <= s.length(); len++){
			for (i = 0; i < s.length() - len + 1; i++){
				j = i + len - 1;
				if (dp[i + 1][j - 1] == 1 && s[i] == s[j]){
					index = i;
					lenMax = len;
					dp[i][j] = 1;
				}
				else{
					dp[i][j] = 0;
				}
			}
		}
		return s.substr(index, lenMax);
	}
	Solution(){
		int i, j;
		for (i = 0; i < 1000; i++){
			for (j = 0; j < 1000; j++)
			if (i == j || i == (j + 1))
				dp[i][j] = 1;
			else
				dp[i][j] = 0;
		}
		index = 0;
		lenMax = 1;
	}
};

int main()
{
	Solution S;
	string s;
	cin >> s;
	cout << S.longestPalindrome(s) << endl;
	return 0;
}

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