KMP模板和模板题目

package 算法模板;
import java.util.*;
public class KMP {
 public static void prefix_table(char pattern[],int prefix[],int n) {//找到表
  prefix[0] = 0;
  int len = 0;
  int i = 1;
  while(i<n) {
   if(pattern[i] == pattern[len]) {
    len++;
    prefix[i]=len;
    i++;
   }else {
    if(len>0)len=prefix[len-1];
    else {
     prefix[i]=0;
     i++;
    }
   }
  }
 }
 public static void move_prefix_table(int prefix[],int n) {//把表的每一个元素后移动一位
  for(int i=n-1;i>0;i--) {
   prefix[i]=prefix[i-1];
  }
  prefix[0]=-1;
 }
 public static void kmp_search(char text[],char pattern[]) {//kmp搜索
  //System.out.println("0000000000");
  int n=pattern.length;
  int m=text.length;
  int prefix[]=new int [n];
  prefix_table(pattern,prefix,n);
  move_prefix_table(prefix,n); 
  //text[i],len(text)=m
  //pattern[j]  , len(pattern)=n
  int i=0;
  int j=0;
  while(i<m) {
   if(j==n-1&&text[i]==pattern[j]) {
    System.out.println(i-j);
    j=prefix[j];
   }
   if(text[i]==pattern[j]) {
    i++;
    j++;
   }else {
    j=prefix[j];
    if(j==-1) {
     i++;
     j++;
    }
   }
  }
 }
 public static void main(String[] args) {
  Scanner sc=new Scanner(System.in);
  char pattern[]="ABABCABAA".toCharArray();
  char text[]="ABABABCABAABABABAB".toCharArray();
  kmp_search(text,pattern);
  
  /*
  char pattern[]="ABABCABAA".toCharArray();
  int prefix[]=new int [9];
  int n=9;
  prefix_table(pattern,prefix,n);
  move_prefix_table(prefix,n); 
  for(int i=0;i<n;i++) {
   System.out.println(prefix[i]);
  }*/
 }
}

模板题目和题解:C - Cyclic Nacklace HDU - 3746
B - Number Sequence HDU - 1711 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1. DFS(深度优先搜索) DFS是一种常用的搜索算法,它可以用来搜索图、树等结构。具体实现时,我们可以使用递归或栈来实现。 2. BFS(广度优先搜索) BFS是一种常用的搜索算法,它可以用来搜索图、树等结构。具体实现时,我们可以使用队列来实现。 3. 动态规划(Dynamic Programming) 动态规划是一种常用的算法思想,它通常用来解决最优化问题。具体实现时,我们需要定义状态转移方程和边界条件。 4. 贪心算法(Greedy Algorithm) 贪心算法是一种常用的算法思想,它通常用来解决最优化问题。具体实现时,我们需要找到一种贪心策略,并证明该策略的正确性。 5. 分治算法(Divide and Conquer) 分治算法是一种常用的算法思想,它通常用来解决复杂的问题。具体实现时,我们需要将问题分成若干个子问题,然后递归地解决这些子问题。 6. 排序算法(Sorting Algorithm) 排序算法是一种常用的算法,它可以对数据进行排序。常见的排序算法包括冒泡排序、选择排序、插入排序、归并排序、快速排序等。 7. 字符串匹配算法(String Matching Algorithm) 字符串匹配算法是一种常用的算法,它可以在文本串中查找一个模式串。常见的字符串匹配算法包括暴力匹配算法、KMP算法、Boyer-Moore算法等。 8. 图论算法(Graph Theory Algorithm) 图论算法是一种常用的算法,它可以用来解决图论问题。常见的图论算法包括最短路径算法、最小生成树算法、拓扑排序算法、最大流算法等。 9. 数学算法(Mathematical Algorithm) 数学算法是一种常用的算法,它可以用来解决各种数学问题。常见的数学算法包括欧几里得算法、素数筛法、快速幂算法、高斯消元法等。 10. 计算几何算法(Computational Geometry Algorithm) 计算几何算法是一种常用的算法,它可以用来解决各种几何问题。常见的计算几何算法包括凸包算法、半平面交算法、点线面的位置关系判断等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值