首页 > 编程语言 >[C++]LeetCode1147. 段式回文

[C++]LeetCode1147. 段式回文

时间:2023-04-12 19:25:19浏览次数:53  
标签:int text 复杂度 C++ LeetCode1147 l1 字符串 回文

[C++]LeetCode1147. 段式回文

题目描述

Difficulty: 困难

Related Topics: 贪心, 双指针, 字符串, 动态规划, 哈希函数, 滚动哈希

你会得到一个字符串 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 仅由小写英文字符组成

思路

贪心 + 字符串哈希

题目要求子串不重叠,因此直接贪心即可。

从前往后扫,对每个左侧区间的左端点\(l1\)从小到大枚举区间长度\(len\),得到区间\([l1,l1+len-1]\),尝试与对应右侧区间\([r2-len+1,r2]\)进行匹配。能匹配上就直接划分,对新的\(l1\)枚举匹配;匹配不上就直接划成一整段。

这个过程类似双指针,根据对称性,可以直接由\(l1\)的值算出\(r2\)的值,写的时候相当于只用一个指针。

区间匹配的时候如果直接遍历,最后复杂度是\(O(n^2)\),可以做字符串hash,将复杂度降到\(O(n)\)。

这道题数据没有构造过,直接自然溢出hash就可以了。

时间复杂度\(O(n)\)

空间复杂度\(O(n)\)(按双指针来写可以边移动指针边算hash值,做到空间复杂度\(O(1)\))

Code

Language: C++

class Solution {
	public:
		typedef unsigned long long ull;
		static const int N = 1024;
		ull f[N] = {0}, p[N] = {0};
		int longestDecomposition(string text) {
			int n = text.size(), res = 0;
			p[0] = 1;
                        // 为了方便,将下标按[1, n]处理
			for (int i = 1; i <= n; ++i) {
				f[i] = f[i - 1] * 131 + text[i - 1] - 'a' + 1;
				p[i] = p[i - 1] * 131ull;
			}
			int l1 = 1;
			while (l1 * 2 <= n + 1) {   // 注意上界,当n为奇数时中间可能单独成段,如"abcab"
				bool check = false; // 能否匹配到右侧区间
				for (int len = 1;  (l1 + len - 1) * 2 <= n ; ++len) {
					int r1 = l1 + len - 1, r2 = n - l1 + 1, l2 = r2 - len + 1;
					if (f[r1] - f[l1 - 1] * p[len] == f[r2] - f[l2 - 1] * p[len]) {
						res += 2; // 匹配成功,左右各一段
						check = true;
						l1 = r1 + 1;
						break;
					}
				}
				if (!check) {
					++res;           // 匹配失败,划成一整段
					break;
				}
			}
			return res;
		}
};

标签:int,text,复杂度,C++,LeetCode1147,l1,字符串,回文
From: https://www.cnblogs.com/yu-xing/p/17310924.html

相关文章

  • PAT-basic-1028 人口普查 java c++
    一、题目某城镇进行人口普查,得到了全体居民的生日。现请你写个程序,找出镇上最年长和最年轻的人。这里确保每个输入的日期都是合法的,但不一定是合理的——假设已知镇上没有超过200岁的老人,而今天是2014年9月6日,所以超过200岁的生日和未出生的生日都是不合理的,应该被过......
  • PAT-basic-1029 旧键盘 java c++
    一、题目旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。输入格式:输入在2行中分别给出应该输入的文字、以及实际被输入的文字。每段文字是不超过80个字符的串,由字母A-Z(包括......
  • c++基础 打卡1
    一、面向对象的编程语言有的特点。    ①面向对象的编程语言最大的特点是结构化程序,二结构化程序的设计思路是自顶向下、逐步求精;其程序化结构是按功能划分为若干个基本模块,这些模块形成一个树状结构;各模块之间的关系尽可能简单,在功能上相对独立;每个模块内部均是由顺序、......
  • 开心档之C++ 修饰符类型
    C++修饰符类型C++允许在 char、int和double 数据类型前放置修饰符。修饰符用于改变基本类型的含义,所以它更能满足各种情境的需求。下面列出了数据类型修饰符:signedunsignedlongshort修饰符 signed、unsigned、long和short 可应用于整型,signed 和 unsigned ......
  • c++ 打卡第三天
    2023-04-12百钱百鸡问题一、问题描述。    一只公鸡值五钱,一只母鸡值三钱,三只小鸡值一钱,我可以通过三种鸡各买多少实现100钱买一百只鸡。二、设计思路。    ①通过以上题我们可以确定两个方程式      公鸡数量+母鸡数量+小鸡数量=100。   ......
  • C++教材第二章课后习题 2-27
    用穷举法找出1~100的质数并显示出来,分别用while,do...while,for循环语句实现1#include<iostream>//for循环语句的实现2#include<cmath>3usingnamespacestd;4intmain()5{6inti,k,m;7for(k=2;k<=100;k++)//从2~1......
  • C++第二章课后练习 2-26
    实现一个简单的菜单程序,运行时显示“Menu:A(dd) D(elete)S(ort)Q(ui Select one:”提示用户输入,A表示增加,D表示删除,S表示排序,Q表示退出,输入为A、D、S时分别提示“数据已经增加、删除、排序。”输入为Q时程序结束。(1)要求使用if…else语句进行判断,用break、continue 控制程序流程......
  • Can't open dsw file in Visual Studio C++ 6.0
    Can'topendswfileinVisualStudioC++6.0 WhenItryto"OpenWorkplace"ofmyproject,visualstudiodoesnothing,solutionexplorerisempty.AlsowhenItrytoopenmyproject,Ioccasionallyseethiserror:Thismakefilewas......
  • 【C++】统计文本词频程序
    1#include<iostream>2#include<fstream>3#include<string>4#include<iomanip>5#include<vector>6#include<map>7#include<cctype>8#include<algorithm>9boolcmp(std::pair<std::strin......
  • 网络框架重构之路plain2.0(c++23 without module) 综述
    最近互联网行业一片哀叹,这是受到三年影响的后遗症,许多的公司也未能挺过寒冬,一些外资也开始撤出市场,因此许多的IT从业人员加入失业的行列,而且由于公司较少导致许多人求职进度缓慢,很不幸本人也是其中之一。自从参加工作以来,一直都是忙忙碌碌,开始总认为工作只是为了更好的生活,但是一......