题目描述
段式回文 其实与 一般回文 类似,只不过是最小的单位是 一段字符 而不是 单个字母。
举个例子,对于一般回文 "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:
输入:text = "ghiabcdefhelloadamhelloabcdefghi"
输出:7
解释:我们可以把字符串拆分成 "(ghi)(abcdef)(hello)(adam)(hello)(abcdef)(ghi)"。
题目解析
通过贪心的方法,进行前后双指针遍历,便利过程中会产生两个字符串,如果两个字符串相等,结果+2。便利结束后若还剩下字母结果再加1。
C++代码
int longestDecomposition(string text) {
int l = 0;
int r = text.size() - 1;
string a;
string b;
int ans = 0;
while(l < r) {
a.push_back(text[l]);
b.insert(0,1, text[r]);
cout << a << " " << b << endl;
if(a == b) {
ans += 2;
a.clear();
b.clear();
}
l++;
r--;
}
cout << a << " " << b << endl;
if(a.size() > 0 || b.size() > 0 || l == r) ans++;
return ans;
}