Trick: int r = (sub + sub).find(sub, 1); 寻找重复pattern。sub.size() % r == 0一定成立。否则设r是查找结果,总能找到更小的r满足条件。
1 class Solution { 2 public: 3 string encode(string s) { 4 int n = s.size(); 5 vector<vector<string>> dp(n + 1, vector<string>(n + 1)); 6 for (int i = 0; i < n; i++) { 7 dp[i][i + 1].push_back(s[i]); 8 } 9 for (int k = 2; k <= n; k++) { 10 for (int i = 0, j = k; j <= n; i++, j++) { 11 dp[i][j] = dp[i][j - 1] + dp[j - 1][j]; 12 for (int m = i + 1; m < j; m++) { 13 string tmp = dp[i][m] + dp[m][j]; 14 if (tmp.size() < dp[i][j].size()) { 15 dp[i][j] = tmp; 16 } 17 } 18 int len = j - i; 19 string sub = s.substr(i, len); 20 int r = (sub + sub).find(sub, 1); 21 if (r < len) { 22 string tmp = to_string(len / r) + "[" + dp[i][i + r] + "]"; 23 if (tmp.size() < dp[i][j].size()) { 24 dp[i][j] = tmp; 25 } 26 } 27 } 28 } 29 return dp[0][n]; 30 } 31 };
时间: 2024-10-14 08:16:17