你会得到一个字符串 text
。你应该把它分成 k
个子字符串 (subtext1, subtext2,…, subtextk)
,要求满足:
subtexti
是 非空 字符串- 所有子字符串的连接等于
text
( 即subtext1 + subtext2 + ... + subtextk == text
) subtexti == subtextk - i + 1
表示所有 i 的有效值( 即1 <= i <= k
)
返回k
可能最大值。
示例 1:
输入:text = "ghiabcdefhelloadamhelloabcdefghi" 输出:7 解释:我们可以把字符串拆分成 "(ghi)(abcdef)(hello)(adam)(hello)(abcdef)(ghi)"。
示例 2:
输入:text = "merchant" 输出:1 解释:我们可以把字符串拆分成 "(merchant)"。
示例 3:
输入:text = "antaprezatepzapreanta" 输出:11 解释:我们可以把字符串拆分成 "(a)(nt)(a)(pre)(za)(tpe)(za)(pre)(a)(nt)(a)"。
提示:
1 <= text.length <= 1000
text
仅由小写英文字符组成
方法一:贪心 + 递归
从字符串的两端开始,如果两端的字符相同,则可以贪心地将这两端的字符作为一段回文串,然后递归处理中间的字符串。
时间复杂度
class Solution:
def longestDecomposition(self, text: str) -> int:
n = len(text)
if n < 2:
return n
for i in range(n // 2 + 1):
if text[:i] == text[-i:]:
return 2 + self.longestDecomposition(text[i: -i])
return 1
class Solution {
public int longestDecomposition(String text) {
int n = text.length();
if (n < 2) {
return n;
}
for (int i = 1; i <= n >> 1; ++i) {
if (text.substring(0, i).equals(text.substring(n - i))) {
return 2 + longestDecomposition(text.substring(i, n - i));
}
}
return 1;
}
}
class Solution {
public int longestDecomposition(String text) {
char[] cs = text.toCharArray();
int res = 0;
for (int i = 0, j = cs.length - 1; i <= j;) {
boolean flag = true;
for (int k = 1; i + k - 1 < j - k + 1; ++k) {
if (check(cs, i, j - k + 1, k)) {
res += 2;
i += k;
j -= k;
flag = false;
break;
}
}
if (flag) {
++res;
break;
}
}
return res;
}
private boolean check(char[] cs, int i, int j, int k) {
while (k-- > 0) {
if (cs[i++] != cs[j++]) {
return false;
}
}
return true;
}
}
class Solution {
public:
int longestDecomposition(string text) {
int n = text.size();
if (n < 2) return n;
for (int i = 1; i <= n >> 1; ++i) {
if (text.substr(0, i) == text.substr(n - i)) {
return 2 + longestDecomposition(text.substr(i, n - i - i));
}
}
return 1;
}
};
func longestDecomposition(text string) int {
n := len(text)
if n < 2 {
return n
}
for i := 1; i <= n>>1; i++ {
if text[:i] == text[n-i:] {
return 2 + longestDecomposition(text[i:n-i])
}
}
return 1
}