您的位置:首页 > 编程语言 > C语言/C++

C/C++编程题刷题:leetcode 1147. 段式回文

2020-08-23 10:01 211 查看

1147. 段式回文

段式回文 其实与 一般回文 类似,只不过是最小的单位是 一段字符 而不是 单个字母。

举个例子,对于一般回文 "

abcba
" 是回文,而 "
volvo
" 不是,但如果我们把 "
volvo
" 分为 "
vo
"、"
l
"、"
vo
" 三段,则可以认为 “
(vo)(l)(vo)
” 是段式回文(分为 3 段)。

 

给你一个字符串 

text
,在确保它满足段式回文的前提下,请你返回  的 最大数量 
k

如果段的最大数量为 

k
,那么存在满足以下条件的 
a_1, a_2, ..., a_k

  • 每个 
    a_i
     都是一个非空字符串;
  • 将这些字符串首位相连的结果 
    a_1 + a_2 + ... + a_k
     和原始字符串 
    text
     相同;
  • 对于所有
    1 <= i <= k
    ,都有 
    a_i = a_{k+1 - i}

 

示例 1:

[code]输入:text = "ghiabcdefhelloadamhelloabcdefghi"
输出:7
解释:我们可以把字符串拆分成 "(ghi)(abcdef)(hello)(adam)(hello)(abcdef)(ghi)"。

示例 2:

[code]输入:text = "merchant"
输出:1
解释:我们可以把字符串拆分成 "(merchant)"。

示例 3:

[code]输入:text = "antaprezatepzapreanta"
输出:11
解释:我们可以把字符串拆分成 "(a)(nt)(a)(pre)(za)(tpe)(za)(pre)(a)(nt)(a)"。

示例 4:

[code]输入:text = "aaa"
输出:3
解释:我们可以把字符串拆分成 "(a)(a)(a)"。
[code]class Solution {
public:
int longestDecomposition(string text) {
int res = 0;
int pre = 0;
int n=text.size();
for(int i = 0;i<n/2;i++){
if (text.substr(pre,i-pre+1) == text.substr(n-i-1,i-pre+1))
{
res+=2;
pre = i+1;
}
}
if (n % 2 == 1 || pre < n / 2)
++res;
return res;
}
};

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: