-
Notifications
You must be signed in to change notification settings - Fork 12
/
471_Encode_String_with_Shortest_Length.cpp
96 lines (75 loc) · 2.63 KB
/
471_Encode_String_with_Shortest_Length.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/*
Problem link: https://leetcode.com/problems/encode-string-with-shortest-length/
Given a non-empty string, encode the string such that its encoded length is the shortest.
The encoding rule is: k[encoded_string], where the encoded_string inside the square brackets is being repeated exactly k times.
Note:
k will be a positive integer.
If an encoding process does not make the string shorter, then do not encode it. If there are several solutions, return any of them.
Example 1:
Input: s = "aaa"
Output: "aaa"
Explanation: There is no way to encode it such that it is shorter than the input string, so we do not encode it.
Example 2:
Input: s = "aaaaa"
Output: "5[a]"
Explanation: "5[a]" is shorter than "aaaaa" by 1 character.
Example 3:
Input: s = "aaaaaaaaaa"
Output: "10[a]"
Explanation: "a9[a]" or "9[a]a" are also valid solutions, both of them have the same length = 5, which is the same as "10[a]".
Example 4:
Input: s = "aabcaabcd"
Output: "2[aabc]d"
Explanation: "aabc" occurs twice, so one answer can be "2[aabc]d".
Example 5:
Input: s = "abbbabbbcabbbabbbc"
Output: "2[2[abbb]c]"
Explanation: "abbbabbbc" occurs twice, but "abbbabbbc" can also be encoded to "2[abbb]c", so one answer can be "2[2[abbb]c]".
*/
// solved by Milon
class Solution {
public:
string encode(string s) {
if (s.length() == 0) return "";
if (mem.find(s) != mem.end()) return mem[s];
string &ret = mem[s];
ret = s;
for(int i = 0; i < s.length(); i++) {
string str = s.substr(0, i+1);
int times = getRepeatedTimes(s, str);
for(int t = 1; t <= times; t++) {
string subs = s.substr(i+1);
if (t == 1) {
string newStr = str + encode(subs);
if (newStr.length() < ret.length())
ret = newStr;
} else {
string restStr = s.substr((i+1)*t);
string newStr = to_string(t) + "[" + encode(str) + "]" + encode(restStr);
if (newStr.length() < ret.length())
ret = newStr;
}
}
}
return ret;
}
private:
unordered_map<string, string> mem;
int getRepeatedTimes(const string &s, const string &t) {
int len = s.length();
int j = 0;
int tLen = t.length();
int times = 0;
for(int i = 0; i < len; i++) {
if (s[i] == t[j]) {
j++;
if (j == tLen) {
times++;
j = 0;
}
} else
break;
}
return times;
}
};