首页 > 编程语言 >[8]-代码随想录算法训练营-day9-字符串-part2

[8]-代码随想录算法训练营-day9-字符串-part2

时间:2023-09-17 14:58:51浏览次数:51  
标签:前缀 day9 int needle 随想录 len next part2 size

代码随想录算法训练营第九天|字符串-part2

1.Leecode 28. 找出字符串中第一个匹配项的下标

  1. 题目

  2. 思路

    • 暴力for循环
  3. 刷随想录后想法

    • KMP模式匹配算法
  4. 实现困难

    • KMP算法理解
  5. 实现代码

    class Solution {
    public:
         void getNext(int *next, string &t){
             //前缀表减一表示法
             int i;
             int j = -1;
             next[0] = -1;
             for (i = 1; i < t.size(); i++){
                 //前后缀不一致
                 while (t[i] != t[j + 1] && j >= 0){
                     j = next[j];
                 }
                 //前后缀一致
                 if (t[i] == t[j + 1]){
                     j++;
                 }
                 next[i] = j;
             }
         }
        int strStr(string haystack, string needle) {
            int i;
            int j = -1;
            int next[needle.size()];
            getNext(next, needle);
            //kmp
            for (i = 0; i < haystack.size(); i++){
                //文本串和模式串匹配不一致
                while (haystack[i] != needle[j + 1] && j >= 0){
                    j = next[j];
                }
                //如果匹配一致
                if (haystack[i] == needle[j + 1]){
                    j++;
                }
                //完成匹配了
                if (j == needle.size() - 1){
                    return (i - needle.size() + 1);
                }
            }
            return -1;
        }
    };
    
  6. 学习收获

    • 理解掌握KMP算法
    • 能够熟练编写KMP算法代码

2.Leecode 459. 重复的子字符串

  1. 题目

  2. 思路

    • 借用前缀表

    • 如果能够用重复子串表示,以abcabcabcabc为例,则其前缀表应该为

      -1 -1 -1 0 1 2 3 4 5 6 7 8
    • 可以明显发现,如果能够用重复子串表示,则前缀表中,三个连续-1所代表的就是子串

    • 前缀表-1之后的前缀,从零开始呈现逐一加一的形式

    • 所以计算串的next数组,然后,利用规律进行判断是否可以表示。

  3. 刷随想录后想法

    • 前半部分思路正确,后半部分关于规律的运用仍然存在问题。
    • 根据Carl哥提示,可以直接利用next[s.size() - 1] +1,即最后一个字符所对应的最长相等前后缀长度进行判断。
  4. 实现困难

    • 规律的运用,关于最终是否的判断
  5. 实现代码

    class Solution {
    public:
         void getNext(int *next, string &t){
             //前缀表减一表示法
             int i;
             int j = -1;
             next[0] = -1;
             for (i = 1; i < t.size(); i++){
                 //前后缀不一致
                 while (t[i] != t[j + 1] && j >= 0){
                     j = next[j];
                 }
                 //前后缀一致
                 if (t[i] == t[j + 1]){
                     j++;
                 }
                 next[i] = j;
             }
         }
        bool repeatedSubstringPattern(string s) {
            int len = s.size();
            int next[len];
            //获取next数组
            getNext(next, s);
    
            //根据next数组,判断是否能够用重复多次构成,len % (len - (next[len - 1] + 1)),如果能够周期性表示,则此部分为0,关于此部分理解看前缀表即可
            if (next[len - 1] != -1 && len % (len - (next[len - 1] + 1)) == 0){
                return true;
            }
            return false;
        }
    };
    
  6. 学习收获

    • 本题主要就是对KMP算法的运用
    • 其次,对于规律的判断,采用简单的数学计算即可

标签:前缀,day9,int,needle,随想录,len,next,part2,size
From: https://www.cnblogs.com/Miubai-blog/p/17708739.html

相关文章

  • [7]-代码随想录算法训练营-day8-字符串-part1
    代码随想录算法训练营第八天|数组字符串-part11.Leecode344.反转字符串题目https://leetcode.cn/problems/reverse-string/思路刷随想录后想法双指针,用swap实现困难无实现代码classSolution{public:voidreverseString(vector<char>&s){......
  • 代码随想录算法训练营-回溯算法-2|55. 跳跃游戏、45. 跳跃游戏 II、1005. K 次取反后
    55. 跳跃游戏1.跳跃的覆盖范围。这个问题就转化为跳跃覆盖范围究竟可不可以覆盖到终点!2. 贪心算法局部最优解:每次取最大跳跃步数(取最大覆盖范围),整体最优解:最后得到整体最大覆盖范围,看是否能到终点。时间复杂度:O(n)空间复杂度:O(1)1classSolution:2defca......
  • Python-day9
    #集合和元组#可变序列可以增删改操作:列表、字典、集合#不可变序列不可以增删改操作:字符串、元组str='beabetterperson,'print(id(str))str=str+'thisisouragreement'print(str)print(id(str))#元组的创建&元组只有一个元素的创建&空元组Y1=('I','like','grape',......
  • 代码随想录算法训练营第十天
    代码随想录算法训练营第十天|LeetCode20(有效的括号)LeetCode1047(删除字符串中的所有相邻重复项)LeetCode150(逆波兰表达式求值)20:有效的括号LeetCode20(有效的括号)方法一importjava.util.Stack;classSolution{publicbooleanisValid(Strings){......
  • 代码随想录算法训练营-回溯算法|455. 分发饼干、376. 摆动序列
    1.贪心算法一般分为如下四步:将问题分解为若干个子问题找出适合的贪心策略求解每一个子问题的最优解将局部最优解堆叠成全局最优解 455. 分发饼干1.局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩。时间复杂度:O(nlogn)空间......
  • [代码随想录]Day46-动态规划part14
    题目:1143.最长公共子序列思路:主要就是两大情况:text1[i-1]与text2[j-1]相同,text1[i-1]与text2[j-1]不相同如果text1[i-1]与text2[j-1]相同,那么找到了一个公共元素,所以dp[i][j]=dp[i-1][j-1]+1;如果text1[i-1]与text2[j-1]不相同,那就看看......
  • 代码随想录算法训练营第九天
    代码随想录算法训练营第九天|LeetCode232(用栈实现队列)LeetCode225(用队列实现栈)栈和队列理论基础定义栈(stack),一种遵循先进后出(FILO—First-In/Last-Out)原则的线性存储结构。队列(queue),一种遵循先进先出(FIFO—firstinfirstout)原则的线性存储结构栈方法方法名......
  • 代码随想录算法训练营第10天| 232.用栈实现队列 ● 225. 用队列实现栈
    栈和队列232.用栈实现队列stack:queue:卡哥代码一个入栈,一个出栈,即可模拟队列的pop操作pop之前要检查出栈是否为空若为空,则排出入栈里所有的元素至出栈中classMyQueue{public:stack<int>stackIn;stack<int>stackOut;MyQueue(){......
  • 【代码随想录算法训练营第二天】977.有序数组的平方、209.长度最小的子数组 、59.螺旋
    Day2-数组2023.9.15Leetcode977有序数组的平方给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新数组,要求也按非递减顺序排序。初解我还是不能想到暴力解法之外的,对某个问题的最优复杂度也没有概念。就算提示我是用指针,我也想不到思路。现在我知......
  • [代码随想录]Day45-动态规划part13
    题目:300.最长递增子序列思路:dp[i]状态取决于dp[0]-dp[i-1]中小于dp[i]的元素中最大的值+1,即:forj:=0;j<i;j++{ifnums[i]>nums[j]{dp[i]=max(dp[i],dp[j]+1)}}代码:动态规划funclengthOfLIS(nums[]int)int{lens:=len(nums)......