每日一题-1147. 段式回文

38 阅读1分钟

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;

    }
};

image.png

每天记录一下做题思路。