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

 

posted on 2017-02-26 15:51  ivancjw  阅读(806)  评论(0编辑  收藏  举报

导航