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

459. 重复的子字符串

时间:2025-01-18 13:46:41浏览次数:1  
标签:459 卡哥 string int len next 重复 字符串 size

题目

这道题不会,看了卡哥思路,卡哥提供了三种方法。

方法一:暴力解法

img

自己写的代码:

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n = s.size();
        for (int len = 1; len <= n / 2; ++len)
        {
            if (n % len != 0)
                continue;
            int k = 0;
            bool flag = true;
            for (int i = 0; i < n; ++i)
            {
                if (s[k++] != s[i])
                {
                    flag = false;
                    break;
                }
                if (k == len)
                    k = 0;
            }
            if (flag)
                return true;
        }
        return false;
    }
};

类似的思路,但是更好的代码:

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int n = s.size();
        for (int len = 1; len <= n / 2; ++len)
        {
            if (n % len != 0)
                continue;
            int k = 0;
            bool flag = true;
            for (int i = 0; i < n; ++i)
            {
                if (s[k] != s[i])
                {
                    flag = false;
                    break;
                }
                k = (k + 1) % len;
            }
            if (flag)
                return true;
        }
        return false;
    }
};

主要是这句代码k = (k + 1) % len;的处理比较好。

方法二:移动匹配

img

卡哥思路里面有证明,证明了充分性和必要性。

跟着卡哥代码写了一下:

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

简短且妙不可言

方法三:KMP

卡哥同样有证明,证明的很详细

跟着卡哥代码写了一下:

class Solution {
public:

    void getNext(int *next, const string &s)
    {
        int j = -1;
        next[0] = j;
        for (int i = 1; i < s.size(); ++i)
        {
            while (j >= 0 && s[i] != s[j + 1])
                j = next[j];
            if (s[i] == s[j + 1])
                j++;
            next[i] = j;
        }
    }

    bool repeatedSubstringPattern(string s) {
        if (s.size() == 0)
            return false;
        int next[s.size()];
        getNext(next, s);
        int len = s.size();
        if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0)
            return true;
        return false;
    }
};

标签:459,卡哥,string,int,len,next,重复,字符串,size
From: https://www.cnblogs.com/hisun9/p/18678381

相关文章

  • 代码随想录 字符串 test 6(KMP,超详细)
    28.找出字符串中第一个匹配项的下标-力扣(LeetCode)一暴力:        以主串中的每个字符为起点,每次匹配从当前主串的起点和子串的首位开始匹配:匹配成功:返回本次匹配的主串起点。匹配失败:以主串的下一个字符作为新起点,重新尝试匹配。时间复杂度为o(m*n)(m为主串长度,n......
  • 编程题-生成交替二进制字符串的最小操作数
    题目:给你一个仅由字符'0'和'1'组成的字符串s。一步操作中,你可以将任一'0'变成'1',或者将'1'变成'0'。交替字符串定义为:如果字符串中不存在相邻两个字符相等的情况,那么该字符串就是交替字符串。例如,字符串"010"是交替字符串,而字符串"0100"不是。返回使s......
  • Python 字符串分割时 spilt 和 re 效率对比
    假设有一些文件名是数字_文档名的格式,如何用python将数字提取出来?可以使用Python的正则表达式模块re提取文件名中的数字部分。以下是实现代码:示例代码:importre#示例文件名列表file_names=["1_file1.txt","2_file2.txt","10_document.doc","random_file.......
  • 算法2-25 有序单链表删除重复元素(附加代码模式)
    题目描述根据一个递增的整数序列构造有序单链表,删除其中的重复元素本题是附加代码模式,主函数main和打印链表的代码会自动附加在同学们提交的代码后面,请同学们在提交的时候注释附加代码。附加代码如下:void PrintList(const List &list){    Node *p = list->nex......
  • 去掉数组中重复的元素。
    #include<stdio.h>#include<stdlib.h>//函数用于移除数组中的重复元素并返回新数组的大小intremoveDuplicates(int*arr,intsize,int**newArray){if(size<=0)return0;//动态分配内存给新的数组*newArray=(int*)malloc(size*sizeof(int));......
  • 【vjudge训练记录】大一寒假专项训练——字符串
    训练情况A题第十届中国大学生程序设计竞赛(济南)-(CCPC2024-Jinan)签到题我们取第一行第一个和后面的进行比较,如果不同的次数超过1次,就说明第一行第一个是不同的那个,如果不同的次数刚好为1次,比较的那个字符串是不同的那个。#include<bits/stdc++.h>#defineintlonglong#defi......
  • 代码随想录 字符串 test 3
    54.替换数字(第八期模拟笔试)        为了不使用额外的空间,采用双指针,通过用旧指针遍历原数组计算出数字个数,进而计算出新数组应有的大小,然后新指针指向新数组的最后,此时新,旧指针都位于两数组的末尾,同时从后往前遍历,遇到数组,新指针就需要写入number,遇到字母,就赋值旧数......
  • 【华为OD-E卷 - 一种字符串压缩表示的解压 100分(python、java、c++、js、c)】
    【华为OD-E卷-一种字符串压缩表示的解压100分(python、java、c++、js、c)】题目有一种简易压缩算法:针对全部由小写英文字母组成的字符串,将其中连续超过两个相同字母的部分压缩为连续个数加该字母,其他部分保持原样不变。例如:字符串“aaabbccccd”经过压缩成为字符串“3ab......
  • post、get请求(查询字符串参数)将对象拼接为地址栏请求参数new URLSearchParams
    constparams=newURLSearchParams({param1:'value1',param2:'value2'}).toString();该方法可将param1和param2拼接为param1=value1&param2=value2实例consturl='https://example.com/api/resource';constparams=newURLSearchP......
  • 写一个方法,将字符串中的单词倒转后输出,如:`my love` -> `ym evol`
    在前端开发中,我们可以使用JavaScript来实现这个功能。以下是一个简单的方法,它接受一个字符串作为参数,然后将字符串中的每个单词倒转后输出:functionreverseWordsInString(str){//将字符串按空格分割成单词数组constwords=str.split('');//使用map函数遍历单词数......