Return the largest possible k such that there exists a_1, a_2, ..., a_k such that: Each a_i is a non-empty string; Their concatenation a_1 + a_2 + ... + a_k is equal to text; For all 1 <= i <= k, a_i = a_{k+1 - i}.
Example 1:
Input: text = "ghiabcdefhelloadamhelloabcdefghi"
Output: 7 Explanation:
We can split the string on "(ghi)(abcdef)(hello)(adam)(hello)(abcdef)(ghi)".
Notes: The first response to this question is that we need to run a recursion with dp or memo, to gradually converge to the base case. See the code below,
class Solution {
public:
int longestDecomposition(string text) {
int res = 1, len = text.size();
vector<vector<int>> memo(len, vector<int>(len, -1));
dsf(text, 0, len-1, memo);
return memo[0][len-1];
}
private:
int dsf(string &ts, int x, int y, vector<vector<int>> &memo) {
if(x<0 || y>=ts.size() || x>y) return 0;
if(memo[x][y] != -1) return memo[x][y];
int t = 1;
for(int i=x; i<=(y-x+1)/2; ++i) {
if(ts.substr(x, i) == ts.substr(y-i+1, i)) {
t = max(t, 2 + dsf(ts, x+i, y-i, memo));
}
}
memo[x][y] = t;
return memo[x][y];
}
};
Then later on it is found that this question can be solved directly with greedy...
See the code below,
class Solution { public: int longestDecomposition(string text) { int len = text.size(); for(int i=1; i<=len/2; ++i) { if(text.substr(0, i) == text.substr(len-i, i)) return 2 + longestDecomposition(text.substr(i, len-2*i)); } return len == 0 ? 0 : 1; } };
No comments:
Post a Comment