2730. 找到最长的半重复子字符串(c++,滑动窗口)

简介: 2730. 找到最长的半重复子字符串(c++,滑动窗口)

给你一个下标从 0 开始的字符串 s ,这个字符串只包含 0 到 9 的数字字符。


如果一个字符串 t 中至多有一对相邻字符是相等的,那么称这个字符串 t 是 半重复的 。例如,0010 、002020 、0123 、2002 和 54944 是半重复字符串,而 00101022 和 1101234883 不是。


请你返回 s 中最长 半重复 子字符串的长度。


一个 子字符串 是一个字符串中一段连续 非空 的字符。

示例 1:


输入:s = "52233"

输出:4

解释:最长半重复子字符串是 "5223" ,子字符串从 i = 0 开始,在 j = 3 处结束。

示例 2:


输入:s = "5494"

输出:4

解释:s 就是一个半重复字符串,所以答案为 4 。

示例 3:


输入:s = "1111111"

输出:2

解释:最长半重复子字符串是 "11" ,子字符串从 i = 0 开始,在 j = 1 处结束。

提示:

  • 1 <= s.length <= 50
  • '0' <= s[i] <= '9'

思路:用当前遍历到的元素减去上一个出现过两个重复元素的右端点,然后迭代找到最大值


int longestSemiRepetitiveSubstring(string s) {  // 函数名:找到最长的半重复子字符串,参数为一个字符串s
    int preLeft = 0, left = 0, ans = 1;  // preLeft表示前一个重复字符的左边界,left表示当前重复字符的左边界,ans表示最长半重复子字符串的长度
 
    for (int i = 1; i < s.size(); ++i) {  // 遍历字符串s的字符
        if (s[i] == s[i - 1]) {  // 如果当前字符和前一个字符相同
            preLeft = left;  // 更新前一个重复字符的左边界为当前重复字符的左边界
            left = i;  // 更新当前重复字符的左边界为当前字符的位置
        }
        ans = max(ans, i - preLeft + 1);  // 更新最长半重复子字符串的长度
    }
 
    return ans;  // 返回最长半重复子字符串的长度
}


所谓半重复子字符串是指字符串中某个子串,其中相邻的两个字符相同,但不要求全部字符都相同。算法采用遍历字符串的方式,通过维护两个指针(preLeft和left)来记录重复字符的位置,并动态更新最长半重复子字符串的长度。

相关文章
|
8月前
|
C语言 C++
【实战指南】 C/C++ 枚举转字符串实现
本文介绍了在C/C++中实现枚举转字符串的实用技巧,通过宏定义与统一管理枚举名,提升代码调试效率并减少维护错误。
504 81
|
搜索推荐 编译器 C语言
【C++核心】特殊的元素集合-数组与字符串详解
这篇文章详细讲解了C++中数组和字符串的基本概念、操作和应用,包括一维数组、二维数组的定义和使用,以及C风格字符串和C++字符串类的对比。
436 5
|
消息中间件 Linux C++
c++ linux通过实现独立进程之间的通信和传递字符串 demo
的进程间通信机制,适用于父子进程之间的数据传输。希望本文能帮助您更好地理解和应用Linux管道,提升开发效率。 在实际开发中,除了管道,还可以根据具体需求选择消息队列、共享内存、套接字等其他进程间通信方
353 16
|
编译器 C语言 C++
C/C++数字与字符串互相转换
C/C++数字与字符串互相转换
|
缓存 网络协议 API
C/C++ StringToAddress(字符串转 boost::asio::ip::address)
通过上述步骤和示例代码,你可以轻松地在C++项目中实现从字符串到 `boost::asio::ip::address`的转换,从而充分利用Boost.Asio库进行网络编程。
452 0
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
HTML+JavaScript构建一个将C/C++定义的ANSI字符串转换为MASM32定义的DWUniCode字符串的工具
567. 字符串的排列(c++)滑动窗口
567. 字符串的排列(c++)滑动窗口
171 1
|
存储 C++
C++(五)String 字符串类
本文档详细介绍了C++中的`string`类,包括定义、初始化、字符串比较及数值与字符串之间的转换方法。`string`类简化了字符串处理,提供了丰富的功能如字符串查找、比较、拼接和替换等。文档通过示例代码展示了如何使用这些功能,并介绍了如何将数值转换为字符串以及反之亦然的方法。此外,还展示了如何使用`string`数组存储和遍历多个字符串。
|
vr&ar C++
1695. 删除子数组的最大得分(C++,滑动窗口)
1695. 删除子数组的最大得分(C++,滑动窗口)
139 0
|
编译器 C++ 开发者
【C++篇】深度解析类与对象(下)
在上一篇博客中,我们学习了C++的基础类与对象概念,包括类的定义、对象的使用和构造函数的作用。在这一篇,我们将深入探讨C++类的一些重要特性,如构造函数的高级用法、类型转换、static成员、友元、内部类、匿名对象,以及对象拷贝优化等。这些内容可以帮助你更好地理解和应用面向对象编程的核心理念,提升代码的健壮性、灵活性和可维护性。