题解 | #密码截取#
密码截取
https://www.nowcoder.com/practice/3cd4621963e8454594f00199f4536bb1
#include <iostream> using namespace std; #include <vector> vector<vector<int>> dp; // 最长对称子数组。 int zcdzzsz(string& s) { int res = 0; int n = s.size(); if( n == 1) return 1; // dp[i][j] 表示以i 和 j为两端时,最长对称子数组的长度 dp.resize(n, vector<int> (n, 0)); // 初始化对角线为1 for (int i = 0; i < n; i++) dp[i][i] = 1; // 斜线遍历 for (int k = 1; k < n; ++k) { for (int i = 0; i + k < n; ++i) { // 对于j == i + 1时,特殊处理。 int j = i + k; if ( j == i + 1) { dp[i][j] = (s[i] == s[j]) ? 2 : 0; } else { if (s[i] == s[j]) { dp[i][j] = (dp[i + 1][j - 1]) ? j - i + 1 : 0; } } res = max(res, dp[i][j]); } } return res; } int main() { string s; cin >> s; int res = zcdzzsz(s); cout << res << endl; return 0; }