首页 > 其他分享 >459_重复的子字符串

459_重复的子字符串

时间:2024-12-19 19:31:35浏览次数:4  
标签:子串 459 string 示例 重复 erase 字符串

Leetcode459重复的子字符串

问题描述

  • 给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。
1. 示例 1:
  - 输入: s = "abab"
  - 输出: true
  - 解释: 可由子串 "ab" 重复两次构成。

2. 示例 2:
  - 输入: s = "aba"
  - 输出: false

3. 示例 3:
  - 输入: s = "abcabcabcabc"
  - 输出: true
  - 解释: 可由子串 "abc" 重复四次构成。 (或子串 "abcabc" 重复两次构成。)

提示:

  • 1 <= s.length <= 10000
  • s 由小写英文字母组成

解法一:暴力(BruteForce)

我们可以使用两层for循环来暴力解决这个问题,思路较为简单。

  1. 考虑到一定是从索引0开始的子串,所以我们子串的长度从1、2、3一直尝试。
  2. 每次我们利用cpp中的函数substr来取子串,和主串中的元素相比较,因为我们取了前length个字符,所以我们可以直接跳过这部分的比较。
  3. 最后再进行简单的逻辑判断即可。
class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n = s.size();

        for(int length = 1; length <= n / 2; length++){
            bool match = true;
            string pattern = s.substr(0,length);

            for(int i = length; i < n; i += length){
                if(pattern != s.substr(i, length)){
                    match = false;
                    break;
                }
            }

            if(match) return true;
        }

        return false;
    }
};

解法二:巧妙的设计:移动匹配

这是一种十分巧妙的算法,假设我们的要判断的文本串为s,则我们可以将两个s拼接起来,然后为了避免重复,我们“掐头去尾”,即去掉第一个字符和最后一个字符,在剩下的字符串中查看是否出现了子串即可。

代码如下:

class Solution{
public:
  bool repeatedSubstringPattern(string s){
    string t = s + s;
    t.erase(t.begin());
    t.erase(t.end() - 1);
    if(t.find(s) != std::string::npos){
      return true;
    }
    return false;
  }
};

代码学习笔记:

  1. 要熟练掌握cppstring类的find()erase()方法,find()方法返回索引,erase()方法用来删除某个字符。
  2. 注意迭代器的begin()指向第一个元素,而end()不是指向最后一个元素,而是最后一个元素的下一个空位置。
  3. nposstd::string中的一个静态成员常量,数据类型为size_t,其经常用来表示在字符串查找函数中没有找到,值为64位无符号数的最大值,我们可以调用打印来尝试一下。
#include <iostream>
#include <string>
int main(){
  std::cout<<std::string::npos<<std::endl;
  //输出结果为18446744073709551615,二进制也就是64个1
  return 0;
}

标签:子串,459,string,示例,重复,erase,字符串
From: https://www.cnblogs.com/shaneyale/p/18617811

相关文章

  • 【C语言练习(12)—反向输出字符串】
    C语言练习(12)文章目录C语言练习(12)前言题目题目解析结果总结前言对于一个给定的字符串,反方向输出该字符串,本次给了循环和利用指针反向输出两种方法题目给定一个字符串,计算该字符串的个数并反向输出例如给定字符串ILoveStudy则反向输出后为ydutSevoLI题目解析......
  • 翻转字符串&翻转单词
    一、翻转字符串问题描述请实现⼀个算法,在不使⽤额外数据结构和储存空间的情况下,翻转⼀个给定的字符串(可以使⽤单个过程变量)。解题思路由于不允许使用额外的数据接口和存储空间,所以我们将⼀个字符串以中间字符为轴,前后翻转,也就是将str[len]赋值给str[0],将str[0]赋值str[len......
  • python的eval()函数的作用是将字符串转换成数值吗?
    不完全正确。Python的eval()函数的作用是将一个字符串作为Python表达式求值,并返回表达式的值。这意味着eval()可以处理各种数据类型和表达式,而不仅仅是将字符串转换成数值。例如:#将字符串转换为数值num_str="3+5"result=eval(num_str)print(result)#输出:8......
  • hibernate2中实体字段太长并且相似导致生成的原生sql字段名重复
    1:错误的hbm.xml<propertyname="holiday1"type="java.lang.String"><columnname="HOLIDAY1"/></property><propertyname="holiday1Start"type="java.util.Date"&......
  • 华为OD E卷(100分)30-字符串变换最小字符串
    前言    工作了十几年,从普通的研发工程师一路成长为研发经理、研发总监。临近40岁,本想辞职后换一个相对稳定的工作环境一直干到老,没想到离职后三个多月了还没找到工作,愁肠百结。为了让自己有点事情做,也算提高一下自己的编程能力,无聊之余打算用一些大厂的编程题练练......
  • 【NLP 16、实践 ③ 找出特定字符在字符串中的位置】
    看着父亲苍老的白发和渐渐老态的面容希望时间再慢一些                                                ——24.12.19一、定义模型1.初始化模型①初始化父类super(TorchModel,self).__init__(): 调用父类nn.Mod......
  • R语言的字符串操作
    【图书推荐】《R语言医学数据分析实践》-CSDN博客《R语言医学数据分析实践李丹宋立桓蔡伟祺清华大学出版社9787302673484》【摘要书评试读】-京东图书(jd.com)R语言医学数据分析实践-R语言的数据结构-CSDN博客在R语言中,字符串是一种表示文本数据的数据类型。字符串......
  • 字符串合并与分割的正确方法是什么?
    在Python中,字符串的合并与分割操作可以通过split()和join()方法实现。以下是详细的说明:字符串分割(split)split()方法用于将字符串按照指定的分隔符分割成多个子字符串,并返回一个列表。如果不指定分隔符,默认使用空白字符(如空格、换行符、制表符等)进行分割。语法格式:str.split......
  • JS中把其它类型转成字符串的方法及规则是什么?
    在JavaScript中,有多种方法可以将其他类型转换为字符串。以下是一些常见的方法和规则:使用toString()方法:几乎所有的JavaScript对象都继承了toString()方法,该方法返回一个表示该对象的字符串。对于原始类型(如Number和Boolean),此方法会返回原始值的文本表示形式。对于数组和对象,默......
  • Java学习,查找数组重复元素
    Java中查找数组中的重复元素可以通过多种方法实现,包括使用额外的数据结构(如 HashSet)来跟踪已经遇到的元素,或者使用嵌套循环来比较数组中的每一对元素。使用 HashSet查找:publicclassFindDuplicates{  publicstaticvoidmain(String[]args){    int[]......