首页 > 代码库 > [LeetCode 471] Encode String with Shortest Length

[LeetCode 471] Encode String with Shortest Length

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 };

 

[LeetCode 471] Encode String with Shortest Length