第二に、問題解決のためのアイデア
- まず、2次元の定義
dp[len][len]
ブール配列を
dp[i][j]
値はから表現するs[i]
とs[j]
、このパリンドローム配列の部分文字列
- 状態遷移方程式:
dp[i][j] = dp[i + 1][j - 1] && s[i] == s[j];
- 説明:頭と尾の要素は、必ずしも同じながら、文字列が回文文字列の場合は、両端を断つ、文字列の残りの部分は、回文である、唯一の方法は、回文文字列です
第三に、問題解決のためのコード
class Solution {
public:
string longestPalindrome(string s) {
string sln;
int len = s.size();
if (!len)
return sln;
if (len == 1)
return s;
int MAX = 1;
int rear = 0, prior = 0;
bool dp[len][len];
for (int i = 0; i < len; i++)
dp[i][i] = true;
for (int i = 1; i < len; i++) {
for (int j = 0; j < len; j++) {
if (i + j < len) {
if (i == 1)
dp[j][i + j] = (s[j] == s[i + j]);
else
dp[j][i + j] = (dp[j + 1][i + j - 1]) && (s[j] == s[i + j]);
if (dp[j][i + j])
if (i + 1 > MAX) {
MAX = i + 1;
rear = j;
prior = i + j;
}
}
}
}
sln = s.substr(rear, prior - rear + 1);
return sln;
}
};
第四に、業績