KMP算法(实战!考研应试技巧放链接)+蓝桥杯算法训练-斐波那契串

本文章学习于蓝桥杯算法训练-斐波那契串_天下一般的博客-CSDN博客_蓝桥杯斐波那契串

由于对KMP算法的不够了解与该博主的编译水平过高,我将再次对其进行解释与说明。

  1. 暴力解法(其实不暴力)
import java.util.*;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = Long.parseLong(sc.nextLine());
        String S = sc.nextLine();
        String pre = "0";
        StringBuffer next = new StringBuffer("1");
        if(S.compareTo("0") == 0){
            System.out.println(Fibonacci(0,n));//如果s是0,就直接开始计算个数
        }else if (S.compareTo("1") == 0){
            System.out.println(Fibonacci(1,n));//如果s是1,就直接开始计算个数
        }
        for(long i = 0;i<=n;i++){
            String temp = next.toString();
            next.append(pre);
            pre = temp;
            if(pre.contains(S)){//简单的类Fibonacci累加,直到出现S。之后的优化算法是contains函数
                System.out.println(Fibonacci(i,n));
                break;
            }
        }
    }

    private static long Fibonacci(long n,long m){
        long a=0,b=1;
        for(long i=n;i<=m;++i){
            long t = b;
            b += a;
            a = t;
        }
        return b-1;//b-1不明白是为什么,理解为是之前借来一个
    }
}



2.

2.1KMP理论部分

        KMP简单来说就是通过提前对待测字符串进行标号,使得在实战寻找时在被寻字符串中的指针不需要移动,言简意赅就是极小的空间复杂度换时间:)

简直就是秦始皇吃花椒,赢麻了

KMP算法及其优化(超详解)_Veritaswhs的博客-CSDN博客_kmp的优化该博主讲的已经很详细了,但是为了具体观看,建议大家前往某蓝色视频网站观看具体详解。主要是关于考研所需的应试技巧,对于实战帮助不大


2.2实战部分

主要是对其中的contains算法进行进一步优化

在博主的学习过程中,在各大视频网站上最多的就是对于KMP算法的应试技巧。

主要是为了应对考研要求,大部分都浅尝辄止

博主的KMP代码部分目前实施尚未成功

伪代码如下:

import java.util.*;
public class Main {
    private static String s;
    private static int[] nx;
    private static boolean KMP(String pre){
        char[] t = pre.toCharArray();//需测长度
        char[] st = s.toCharArray();
        int n = t.length,m = st.length;
        nx = new int[n+1];
        int j=0,k=-1;
        nx[j] = -1;
        while(j<n){
            if(k == -1||t[j] == t[k]){//基础薄弱同学建议一步一步带入跟着走
                j++;k++;
                if(j!=n && t[j] == t[k])nx[j]=nx[k];
                else nx[j] = k;
            }else k = nx[k];//k大部分为-1/0
        }
        
        j=0;int i=0;//将KMP的nextval求出之后进行寻找
        while (i<m){
            if(j == -1 || st[i] == t[j]){
                i++;j++;
            }else j = nx[j];//核心部分
            if (j == n)return true;
        }
        return false;
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = Long.parseLong(sc.nextLine());
        s = sc.nextLine();
        String pre = "0";
        StringBuffer next = new StringBuffer("1");
        if(s.compareTo("0") == 0){
            System.out.println(Fibonacci(0,n));
        }else if (s.compareTo("1") == 0){
            System.out.println(Fibonacci(1,n));
        }
        for(long i = 0;i<=n;i++){
            String temp = next.toString();
            next.append(pre);
            pre = temp;
            if(KMP(pre)){
                System.out.println(Fibonacci(i,n));
                break;
            }
        }
    }
    private static long Fibonacci(long n,long m){
        long a=0,b=1;
        for(long i=n;i<=m;++i){
            long t = b;
            b += a;
            a = t;
        }
        return b-1;
    }
}


NEXTVAL(伪)
位置0123456
t[ ]ABCABDC
nextval[ ]-100-102

博主在后续学习通透之后,会继续更新。爱你们~

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值