1147. 段式回文
难度:困难
题目:
你会得到一个字符串 text
。你应该把它分成 k
个子字符串 (subtext1, subtext2,…, subtextk)
,要求满足:
subtexti
是 非空 字符串- 所有子字符串的连接等于
text
( 即subtext1 + subtext2 + ... + subtextk == text
) - 对于所有 i 的有效值( 即
1 <= i <= k
) ,subtexti == subtextk - i + 1
均成立
返回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
仅由小写英文字符组成
个人思路
方法一:贪心 + 双指针
采用双指针的思路,一个指向头i,一个指向尾j,创建一个栈s,先把text[i]压入,再把text[j]压入,每次压入,检查s的最后一个元素是否和将要压入text[i/j]相同,如果相同,弹出s的最后一个元素,而且不压入text[i/j]元素;如果不同,则直接压入。
你发现如果存在回文段,那么此时s的状态是空,(得到的是最短的回文段),记录ans++,遍历完之后,ans*=2,因为是成双出现。最后考虑i,j位置和s的状态,来决定中间的单个字符串是否存在。 空间复杂度 O(n) 时间复杂度 O(n) 执行用时:0 ms 内存消耗:6.2 MB
代码
class Solution {
public:
int longestDecomposition(string text) {
vector<int> s;
int i=0;
int j=text.size()-1;
int ans=0;
while(i<j){
if(s.empty())
s.push_back(text[i]);
else if(s[s.size()-1]==text[i]){
s.pop_back();
if(s.empty())
ans++;
}else{
s.push_back(text[i]);
}
if(s.empty())
s.push_back(text[j]);
else if(s[s.size()-1]==text[j]){
s.pop_back();
if(s.empty())
ans++;
}else{
s.push_back(text[j]);
}
i++,j--;
}
ans*=2;
if(i==j||!s.empty())
ans++;
return ans;
}
};
每天记录一下做题思路。