写点什么

33 | 字符串匹配基础(中 , 下):如何实现文本编辑器中的查找功能

作者:鲁米
  • 2023-12-13
    北京
  • 本文字数:1620 字

    阅读完需:约 5 分钟

你熟悉的编程语言中的查找函数,或者工具、软件中的查找功能,都是用了哪种字符串匹配算法呢?


在 Java 编程语言中,字符串的查找函数主要是使用 Brute-Force 算法(朴素字符串匹配算法)或 KMP 算法(Knuth-Morris-Pratt 算法)。这两种算法是常见的字符串匹配算法,各有优劣,具体选择取决于应用场景和需求。


KMP 算法:

KMP 算法是一种改进的字符串匹配算法,它通过预处理模式串,构建一个部分匹配表(Partial Match Table),然后利用这个表来避免在匹配过程中回溯主串的操作。KMP 算法在某些情况下比 Brute-Force 算法更高效,尤其是对于大文本和较长模式串的匹配。


public class KMP {    public static int kmpSearch(String text, String pattern) {        int[] lps = calculateLPS(pattern);        int i = 0, j = 0;        while (i < text.length()) {            if (pattern.charAt(j) == text.charAt(i)) {                i++;                j++;            }            if (j == pattern.length()) {                return i - j;            } else if (i < text.length() && pattern.charAt(j) != text.charAt(i)) {                if (j != 0) {                    j = lps[j - 1];                } else {                    i++;                }            }        }        return -1;    }
private static int[] calculateLPS(String pattern) { int[] lps = new int[pattern.length()]; int len = 0, i = 1; while (i < pattern.length()) { if (pattern.charAt(i) == pattern.charAt(len)) { len++; lps[i] = len; i++; } else { if (len != 0) { len = lps[len - 1]; } else { lps[i] = 0; i++; } } } return lps; }
public static void main(String[] args) { String text = "ABABDABACDABABCABAB"; String pattern = "ABABCABAB"; int index = kmpSearch(text, pattern); if (index != -1) { System.out.println("Pattern found at index " + index); } else { System.out.println("Pattern not found"); } }}
复制代码


Brute-Force 算法:

也称为朴素字符串匹配算法,它是一种简单直观的字符串匹配算法。它的基本思想是通过两个嵌套循环,在主串中逐个比较子串和模式串的字符,直到找到匹配或者搜索到主串末尾。这是一种最基本的、最容易理解的字符串匹配方法,但在某些情况下可能效率较低,特别是对于长主串和短模式串的匹配。


public class BruteForce {    public static int bruteForceSearch(String text, String pattern) {        int m = text.length();        int n = pattern.length();
for (int i = 0; i <= m - n; i++) { int j; for (j = 0; j < n; j++) { if (text.charAt(i + j) != pattern.charAt(j)) { break; } } if (j == n) { return i; // Pattern found at index i } } return -1; // Pattern not found }
public static void main(String[] args) { String text = "ABABDABACDABABCABAB"; String pattern = "ABABCABAB"; int index = bruteForceSearch(text, pattern); if (index != -1) { System.out.println("Pattern found at index " + index); } else { System.out.println("Pattern not found"); } }}
复制代码


用户头像

鲁米

关注

生活黑客35 2019-06-11 加入

起点不重要,迭代很重要,就需要保持充分的开放和积累;而信息越充分,结果越可靠,又要求随时调整、不断逼近真相。

评论

发布
暂无评论
33 | 字符串匹配基础(中 ,下):如何实现文本编辑器中的查找功能_鲁米_InfoQ写作社区