substring 左闭右开
String a = “abcdefghijklmn”;
a.substring(2, 3);显示 “c”
a.substring(2, 4);显示 “cd”
C++ string::substr(pos,len) 第二个参数是子串的长度!!!
https://leetcode.cn/problems/longest-palindromic-substring/
最长回文子串与回文最小分割数一样的思路
注意:利用好字符串以‘\0’结尾,从字符串尾开始dp,省超多事!!!
int n = s.size();
int dp[1005];//从i点往后的最大字串长度
memset(dp, 0, sizeof(dp));
bool ispalin[1005][1005];
for (int i = 0; i < n + 5; i++)
for (int j = 0; j < n + 5; j++)
ispalin[i][j] = false;
for (int i = s.size(); i >= 0; i--) {
for (int j = i; j < s.size(); j++) {
if (s[i] == s[j] && (j - i <= 1 || ispalin[i + 1][j - 1])) {
ispalin[i][j] = true;
dp[i] = max({ dp[j],dp[i],j - i + 1 });//利用好字符串以‘\0’结尾
}
else
dp[i] = max(dp[i], dp[j]);
}
}
for (int i = 0; i <= n; i++)
cout << dp[i] << " ";
cout << endl;
int max = dp[0], index = -1;
for (int i = s.size(); i >= 0; i--) {
if (dp[i] == max) {
index = i;
break;
}
}
string s1 = s.substr(index , max);
cout << max << " " << index << endl;
cout << s1 << endl;
这是从字符串首开始的dp
int n = s.size();
int dp[1005];
memset(dp, 0, sizeof(dp));
bool ispalin[1005][1005];
for (int i = 0; i < n+5; i++)
for (int j = 0; j < n+5; j++)
ispalin[i][j] = 0;
for (int i = 1; i <= n; i++) {
for (int j = i; j >= 1; j--) {
if (s[i - 1] == s[j - 1] && (i - j <= 1 || ispalin[i - 2][j])) {
dp[i] = max({ dp[i], i - j + 1,dp[j] });
ispalin[i-1][j-1] = true;
}
else
dp[i] = max(dp[i], dp[j]);
}
}
for (int i = 0; i <= n; i++)
cout << dp[i] << " ";
cout << endl;
int max = dp[n], index = -1;
for (int i = 0; i <= n; i++) {
if (dp[i] == max) {
index = i;
break;
}
}
string s1 = s.substr(index - max, max);
//cout << max << " " << index << endl;
cout << s1 << endl;