LeetCode·每日一题·1147. 段式回文·贪心

作者:小迅
链接:https://leetcode.cn/problems/longest-chunked-palindrome-decomposition/solutions/2221973/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-e3jii/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处

题目LeetCode·每日一题·1147. 段式回文·贪心_第1张图片

 

示例LeetCode·每日一题·1147. 段式回文·贪心_第2张图片

 

思路

给定一个字符串,分割成k个子串,其中子串s[i] == s[k-i],返回最大的k值。

要求返回最大的分割子串,那么每次进行分割都应该按最小值来进行切割,每次切割都最小子串(局部最优)那么分割出来的子串数量将会更多(整体最优)。比如aaaa,可以分割为 a-a、a-a和aa-aa,很显然前者分割的子串更多。

那么既然知道如何分割才能使得整体数量最多,可以使用双指针枚举字符串的前缀和后缀子串,比较前后缀子串是否相同,存在相同就进行分割,再重复上述操作,直至不能再分割,最后判断是否还有剩余子串,存在则最后返回值需要加上当前子串数

代码注释超级详细

 

代码


int strCmp(char *str1, int l1, int r1, char *str2, int l2, int r2)
{//比较两个字符串是否相同
    while (l1 <= r1) {
        if (str1[l1] != str2[l2]) return 0;
        ++l1;
        ++l2;
    }
    return 1;
}

int longestDecomposition(char * text){
    int count = 0;
    int len = strlen(text);
    int l = 0, r = len-1;//前缀起始点、后缀结束点
    for (int i = 0; i < len / 2; ++i) {//枚举分割点
        if (strCmp(text, l, i, text, len-i-1, r)) {
            count += 2;//可以分割,直接分割,标准每次分割子串最短
            l = i+1;//更新前缀起始点
            r = len-i-1-1;//更新后缀结束点
        }
    }
    return  count + (l <= r ? 1 : 0);//判断是否还有剩余子串
}

作者:小迅
链接:https://leetcode.cn/problems/longest-chunked-palindrome-decomposition/solutions/2221973/tan-xin-zhu-shi-chao-ji-xiang-xi-by-xun-e3jii/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(LeetCode刷题笔记,leetcode,算法,c++)