• BF算法与KMP算法(字符串匹配算法)


    BF算法

    BF算法,简称暴力破解 Bruce Force ,又称朴素模式的匹配算法。

    可以看出BF算法的思想就是将目标串S的第一个字符与模式串T的第一个字符进行匹配,

    若相等,则继续比较S的第二个字符和T的第二个字符;

    若不相等,则比较S的第二个字符和T的第一个字符,依次比较,直到得出最后的匹配结果。

    这种算法的比较很暴力,由于产生了多次的回溯,在效率上存在很大的缺陷。

    时间复杂度O(m*n)

    代码:

     1 package bf;
     2 
     3 public class Test {
     4     public static void main(String[] args) {
     5         String bf = "IloveChinveChia";
     6         String pattern = "veChi";
     7         int m = bf.length(); // i
     8         int n = pattern.length(); // j
     9         int i = 0, j = 0;
    10         while (i < m) {
    11             if (bf.charAt(i) == pattern.charAt(j)) { // 一一匹配时
    12                 i++;
    13                 j++;
    14             } else {
    15                 i = i - j + 1;
    16                 j = 0;
    17             }
    18             if (i == m)
    19                 break;
    20             if (bf.charAt(i) == pattern.charAt(j) && j == n - 1) {
    21                 System.out.println(i - j);
    22                 if (i < m) {
    23                     j = 0;
    24                 } else {
    25                     break;
    26                 }
    27             }
    28         }
    29     }
    30 }

    KMP算法

    代码:

     1 package kmp;
     2 
     3 public class Test {
     4 
     5     public static void main(String[] args) {
     6         String text = "ABABABCABAASFAWAIFAS";
     7         String pattern = "ABABCABAA";
     8         kmp_search(text, pattern);
     9     }
    10   //计算公共前后缀,形成前缀表
    11     static void prefix_table(String pattern, int prefix[], int n) {
    12         prefix[0] = 0;
    13         int len = 0;
    14         int i = 1;
    15         while (i < n) {
    16             if (pattern.charAt(i) == pattern.charAt(len)) {
    17                 len++;
    18                 prefix[i] = len;
    19                 i++;
    20             } else {
    21                 if (len > 0) {
    22                     len = prefix[len - 1];
    23                 } else {
    24                     prefix[i] = len;
    25                     i++;
    26                 }
    27             }
    28         }
    29     }
    30   //移位 ---》 next数组
    31     static void move_prefix_table(int prefix[], int n) {
    32         int i;
    33         for (i = n - 1; i > 0; i--) {
    34             prefix[i] = prefix[i - 1];
    35         }
    36         prefix[0] = 0;
    37     }
    38   // kmp算法 依据 next数组来匹配字符串
    39     static void kmp_search(String text, String pattern) {
    40         int n = pattern.length();
    41         int m = text.length();
    42         int prefix[] = new int[n];
    43         prefix_table(pattern, prefix, n);
    44         move_prefix_table(prefix, n);
    45         // ----------做好准备工作(计算出next数组)-------------
    46         // text[i] len(text) = m
    47         // patten[j] len(partten) = n
    48         int i = 0, j = 0;
    49         while (i < m) {
    50             if (j == n - 1 && text.charAt(i) == pattern.charAt(j)) {
    51                 System.out.println("Found pattern at:" + (i - j));
    52                 j = prefix[j];
    53             }
    54             if (text.charAt(i) == pattern.charAt(j)) {
    55                 i++;
    56                 j++;
    57             } else {
    58                 j = prefix[j];
    59                 if (j == -1) {
    60                     i++;
    61                     j++;
    62                 }
    63             }
    64         }
    65     }
    66 }

    参考资料:

    https://blog.csdn.net/x__1998/article/details/79951598

    https://www.bilibili.com/video/av16828557?t=1484

    https://www.cnblogs.com/yjiyjige/p/3263858.html

  • 相关阅读:
    qq
    构造方法
    Java模块化开发
    q
    qqq
    qq
    qqq
    Git服务器搭建及SSH无密码登录设置
    php面向对象中的魔术方法中文说明
    计算机中丢失 msvcr110.dll 怎么办
  • 原文地址:https://www.cnblogs.com/liuzeyu12a/p/10326148.html
Copyright © 2020-2023  润新知