首页 > 编程语言 >代码随想录算法训练营第九天| 28. 实现 strStr() 459.重复的子字符串 字符串总结 双指针回顾

代码随想录算法训练营第九天| 28. 实现 strStr() 459.重复的子字符串 字符串总结 双指针回顾

时间:2024-02-01 18:45:43浏览次数:43  
标签:子串 第九天 string int 随想录 重复 字符串 size

 28. 实现 strStr()

给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回  -1 

题目链接:28. 找出字符串中第一个匹配项的下标 - 力扣(LeetCode)

思路:标标准准的kmp算法,可以我不会写,只能用土方法for循环了。

class Solution {
public:
    int strStr(string haystack, string needle) {
        int i=0;
        int j=0;
        int tmp=i;
        if(haystack.size()<needle.size())
            return -1;
        for(;i<haystack.size();i++){
            tmp=i;
            while(haystack[tmp]==needle[j]&&j<needle.size()){tmp++;j++;}
            if(j==needle.size()){
                return i;
            }
            j=0;
        }
        return -1;

    }
};

似乎是把KMP看懂了,先把KMP算法放这里吧

class Solution {
public:
    int strStr(string s, string p) {
        int n = s.size(), m = p.size();
        if(m == 0) return 0;
        //设置哨兵
        s.insert(s.begin(),' ');
        p.insert(p.begin(),' ');
        vector<int> next(m + 1);
        //预处理next数组
        for(int i = 2, j = 0; i <= m; i++){
            while(j and p[i] != p[j + 1]) j = next[j];
            if(p[i] == p[j + 1]) j++;
            next[i] = j;
        }
        //匹配过程
        for(int i = 1, j = 0; i <= n; i++){
            while(j and s[i] != p[j + 1]) j = next[j];
            if(s[i] == p[j + 1]) j++;
            if(j == m) return i - m;
        }
        return -1;
    }
};

459.重复的子字符串

给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。

题目链接:459. 重复的子字符串 - 力扣(LeetCode)

思路:开始时认为本题可以根据字母出现次数来解决,结果发现不充要,因为所有字母(不为0的)出现次数存在共同公因数时未必有循环字符串,是必要不充分。只能老老实实用字符串处理了。

思路(真):从2开始尝试子串重复次数,子串的重复次数应满足:1、2<=i<=字符串长度2、是字符串长度的因数。当找到可能得子串重复次数后,子串长度也能确定了。在按位确定子串是否循环至字符串末尾。效率竟然意外的不错。

class Solution {
public:
    bool repeatedSubstringPattern(string s) {
        int length=s.size();
        int cl;     //子串长度
        int i=2;    //子串重复次数
        while(i<=length){
            if(length%i)
            {
                ++i;continue;
            }
            cl=length/i;
            int k=1;                                //k*cl==按位比较时的偏移量
            for(int j=0;j<cl;j++){
                while(k<i&&s[j]==s[j+k*cl])++k;    //注意逻辑判断顺序不能更换
                if(k!=i)break;                     
                k=1;                               //勿忘重置k
                if(j==cl-1)return true;
                }
            i++;
            }
        return false;
        }
};

啊?

标签:子串,第九天,string,int,随想录,重复,字符串,size
From: https://www.cnblogs.com/Liubox/p/18001861

相关文章

  • C# 自己写的编码机制,将任意字节数组和可打印中文字符串相互转换
    正常情况下咱们可以用Base64将字节数组转成可打印字符串,但是有的时候咱们需要编码后具有一定的保密性,很明显Base64就不适用了,网上有个与熊论道就挺有意思的,于是我也研究学习了下,自己实现了一个将字节流编码为可打印(可拷贝)中文字符串的功能,反之,也能将中文字符串解码为原始字节流......
  • 代码随想录 day37 单调递增的数字 监控二叉树
    单调递增的数字只想到暴力解法然后超时这里思路是如果从后往前发现不是递增序列那就把前一位--后一位数字变成9然后维护这个变成9的坐标遍历完后把后面的也全部变成9这个对现在的我来说太难了先贴段代码理解一下吧classSolution{intres=0;publicintminCam......
  • 代码随想录算法训练营第四天 |24. 两两交换链表中的节点 | 19.删除链表的倒数第N个节
    142.环形链表II 已解答中等 相关标签相关企业 给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。为了表示给定链表中的环,......
  • 页面跳转传参,携带的数值型数据会转成是字符串
    onLoad(options){let{limit,index}=optionsindex=Number(index);limit=Number(limit)console.log(options); //获取视频页面数据wx.cloud.callFunction({name:'getMedia',data:{sort:'video',......
  • 交替字符串排列
    defalternative_string_arrange(first_str:str,second_str:str)->str:"""返回两个字符串的交替排列。:paramfirst_str:第一个字符串:paramsecond_str:第二个字符串:return:交替排列后的字符串>>>alternative_string_arrange("ABCD&qu......
  • 指针扫描型字符串算法
    【最小表示法】最小表示法循环表示:从一个位置开始向后遍历,到末尾再倒回去最前面。一个字符串(数组)一共有\(n\)个。最小表示法就是最小的循环表示。例如,31491的最小表示法是13149.如果我们用打擂台比大小的方式,因为字符串之间比较需要时间,总共是\(O(n^2)\)的,太慢......
  • 字符串算法学习笔记
    \(\text{Pt.}1\)基础一、进制哈希二、Manacher三、Trie\(\text{Pt.}2\)自动机自动机是什么?它是一个对“信息序列”进行判定的数学模型。“信息序列”可以很随意,比如一个二进制数,比如一个字符串。而“判定”也可以很随意,比如判定一个二进制数是不是奇数,判定当前字符串是......
  • 初等字符串
    $CuO+CO\triangleqCu+CO_2$初等字符串字符串Hash\(\bf{Hash}:\)一种好用又cd的算法\(·First\)如果要比较两个字符串的大小,开\(string\)两两比较是\(O(n)\)の算法如果进行\(m\)次比较的话$O(m\timesn)$显然去世考虑\(O(m)\)の算法,即让比较过程变为\(O(1)\)......
  • Java中比较两个字符串==和.equals()区别
    ​在Java中,==和.equals()都是用于比较两个字符串是否相等的运算符,==比较的是两个字符串的引用地址,而.equals()比较的是两个字符串的内容。只有当两个字符串变量指向同一个字符串对象时,==和.equals()才会返回相同的结果 参考文档:Java中比较两个字符串==和.equals()区......
  • 代码随想录算法训练营第八天| 344.反转字符串 541. 反转字符串II 卡码网:54.替换数字
    反转字符串编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用O(1)的额外空间解决这一问题。题目链接:344.反转字符串-力扣(LeetCode)关于是否用reverse函数解决问题:如果题目......