java-字符串处理算法

news2024/11/26 14:40:31

Java的字符串处理算法

1. KMP算法(Knuth-Morris-Pratt Algorithm)

定义
KMP算法是一种用于字符串搜索的高效算法,它可以在O(n+m)的时间复杂度内找到模式串在文本串中的第一次出现的位置,其中n是文本串的长度,m是模式串的长度。

原理
KMP算法的核心是构建一个部分匹配表(也称为前缀函数或失败函数),用于在不匹配时避免从头开始搜索模式串。

Java实现示例

public class KMP {
    public static void search(String text, String pattern) {
        int[] lps = computeLPSArray(pattern);
        int i = 0; // index for text
        int j = 0; // index for pattern
        while (i < text.length()) {
            if (pattern.charAt(j) == text.charAt(i)) {
                i++;
                j++;
            }
            if (j == pattern.length()) {
                System.out.println("Found pattern at index " + (i - j));
                j = lps[j - 1];
            } else if (i < text.length() && pattern.charAt(j) != text.charAt(i)) {
                if (j != 0) {
                    j = lps[j - 1];
                } else {
                    i++;
                }
            }
        }
    }

    // Build LPS array
    private static int[] computeLPSArray(String pattern) {
        int[] lps = new int[pattern.length()];
        int len = 0; // length of the previous longest prefix suffix
        int i = 1;
        lps[0] = 0; // lps[0] is always 0
        while (i < pattern.length()) {
            if (pattern.charAt(i) == pattern.charAt(len)) {
                len++;
                lps[i] = len;
                i++;
            } else { // (pat.charAt(i) != pat.charAt(len))
                if (len != 0) {
                    len = lps[len - 1];
                } else { // if (len == 0)
                    lps[i] = 0;
                    i++;
                }
            }
        }
        return lps;
    }

    public static void main(String[] args) {
        String text = "ABABDABACDABABCABAB";
        String pattern = "ABABCABAB";
        search(text, pattern);
    }
}
2. Rabin-Karp算法

定义
Rabin-Karp算法是一种用于字符串搜索的算法,它利用了哈希函数来快速筛选出可能匹配的子串,然后进行详细的比较。

原理
算法通过计算模式串和文本串中每个可能的子串的哈希值来快速找到匹配的子串。

Java实现示例

import java.util.HashMap;
import java.util.Map;

public class RabinKarp {
    public static int search(String text, String pattern) {
        long patternHash = hash(pattern);
        long currentHash = hash(text.substring(0, pattern.length()));
        int modulus = (int)1e9 + 9;
        for (int i = 0; i <= text.length() - pattern.length(); i++) {
            if (currentHash == patternHash) {
                if (i <= text.length() - pattern.length()) {
                    // Check if characters match
                    int j;
                    for (j = 0; j < pattern.length(); j++) {
                        if (text.charAt(i + j) != pattern.charAt(j)) {
                            break;
                        }
                    }
                    if (j == pattern.length()) {
                        return i;
                    }
                }
            }
            if (i < text.length() - pattern.length()) {
                currentHash = (currentHash - (text.charAt(i) * pow(256, pattern.length() - 1, modulus))) * 256 + text.charAt(i + pattern.length());
                currentHash = (currentHash + modulus) % modulus;
            }
        }
        return -1;
    }

    private static long hash(String key) {
        long hash = 0;
        for (int i = 0; i < key.length(); i++) {
            hash += key.charAt(i);
            hash %= 1000000007; // Using prime number as modulus
        }
        for (int i = 0; i < key.length() - 1; i++) {
            hash = (hash * 256) % 1000000007;
        }
        return hash;
    }

    private static long pow(int x, int n, int mod) {
        long res = 1;
        x = x % mod;
        while (n > 0) {
            if (n % 2 == 1) {
                res = (res * x) % mod;
            }
            x = (x * x) % mod;
            n = n / 2;
        }
        return res;
    }

    public static void main(String[] args) {
        String text = "hello world";
        String pattern = "world";
        System.out.println(search(text, pattern));
    }
}
3. Z算法(Z-Algorithm)

定义
Z算法是一种字符串搜索算法,它可以在O(n+m)的时间复杂度内找到模式串在文本串中的所有出现位置。

原理
算法通过比较模式串和文本串的字符来构建一个Z数组,该数组表示模式串中每个位置的最长相同前缀和后缀的长度。

Java实现示例

public class ZAlgorithm {
    public static int[] computeZArray(String text, String pattern) {
        int n = text.length();
        int m = pattern.length();
        int[] z = new int[n];
        int j = 0;
        for (int i = 1; i < n; i++) {
            if (i > j) {
                j = 0;
                while (j < m && pattern.charAt(j) == text.charAt(i + j)) {
                    j++;
                }
                z[i] = j;
                if (j > 0) {
                    j--;
                }
            }
            while (n - i < j && j > 0) {
                z[i + n - j] = j;
                j--;
            }
        }
        return z;
    }

    public static void main(String[] args) {
        String text = "ABABDABACDABABCABAB";
        String pattern = "ABABCABAB";
        int[] zArray = computeZArray(text, pattern);
        for (int i = 0; i < zArray.length; i++) {
            System.out.println("z[" + i + "]: " + zArray[i]);
        }
    }
}
4. 后缀数组(Suffix Array)

定义
后缀数组是一种数据结构,用于存储一个字符串的所有后缀的排序列表。

原理
后缀数组的构建通常涉及对字符串的所有后缀进行排序,然后根据字典序排列。它在字符串比较、模式匹配和相似性搜索中非常有用。

Java实现示例

import java.util.Arrays;

public class SuffixArray {
    public static int[] buildSuffixArray(String s) {
        int n = s.length();
        int[] suffixes = new int[n];
        for (int i = 0; i < n; i++) {
            suffixes[i] = i;
        }
        Arrays.sort(suffixes, (a, b) -> {
            int res = s.charAt(a) - s.charAt(b);
            if (res == 0) {
                return s.substring(a).compareTo(s.substring(b));
            }
            return res;
        });
        return suffixes;
    }

    public static void main(String[] args) {
        String s = "banana";
        int[] suffixArray = buildSuffixArray(s);
        for (int index : suffixArray) {
            System.out.println(s.substring(index));
        }
    }
}

这些算法在处理字符串搜索和比较问题时非常有用,它们各自有不同的应用场景和优势。KMP和Rabin-Karp适用于单模式匹配,Z算法和后缀数组适用于多模式匹配和更复杂的字符串分析任务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[C++]了解内置类型升级

内置类型升级 1.调用模板T时&#xff0c;为什么可以使用T()类型的匿名对象来传参2.内置类型被升级成为类后的使用事项 1.调用模板T时&#xff0c;为什么可以使用T()类型的匿名对象来传参 当我们在定义或声明一个函数时&#xff0c;如果想使用模板T类型的默认构造&#xff08;例…

JavaScript的基础数据类型

一、JavaScript中的数组 定义 数组是一种特殊的对象&#xff0c;用于存储多个值。在JavaScript中&#xff0c;数组可以包含不同的数据类型&#xff0c;如数字、字符串、对象、甚至其他数组。数组的创建有两种常见方式&#xff1a; 字面量表示法&#xff1a;let fruits [apple…

Neural Magic 发布 LLM Compressor:提升大模型推理效率的新工具

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

友思特新闻 | 友思特荣获广州科技创新创业大赛智能装备行业赛初创组优胜企业!

2024年11月19日&#xff0c;第十三届中国创新创业大赛&#xff08;广东广州赛区&#xff09;暨2024年广州科技创新创业大赛智能装备行业赛颁奖典礼隆重举行。 赛事奖项介绍&#xff1a;广州科技创新创业大赛智能装备行业赛 第十三届“中国创新创业大赛&#xff08;广东广州赛区…

以灵魂的方式进入:从table和drawer哪个单词更长说起

有两个单词&#xff0c;table和drawer&#xff1a; table n.桌子drawer n.抽屉 现在就问&#xff0c;这两个单词&#xff0c;哪个单词更长&#xff1f;你会说&#xff0c;神经&#xff0c;这还用问吗&#xff1f;哪个单词更长&#xff0c;不一目了然吗&#xff1f; 其实&…

车载测试核心知识点和面试题

今天为大家分享一下车载测试岗位面试的时候&#xff0c;一定会问的相关技术。这些工具在测试的工作中会用到&#xff0c;在面试中也会经常被问到。所以同学们一定要去实战操作&#xff0c;这样理解和吸收才会更加深刻。 一、车载仪表台架测试CANoe工具实战 我们知道&#xff…

C/C++逆向:虚函数逆向分析

虚函数&#xff08;Virtual Function&#xff09;是C中实现多态的一种机制&#xff0c;它允许在运行时通过基类的指针或引用调用派生类中的函数&#xff0c;而不是基类中的版本。虚函数通常与继承和多态结合使用。通过在基类中使用 virtual 关键字声明函数&#xff0c;允许派生…

es写入磁盘的过程以及相关优化

数据写入到内存buffer同时写入到数据到translog buffer,这是为了防止数据不会丢失每隔1s数据从buffer中refresh到FileSystemCache中,生成segment文件,这是因为写入磁盘的过程相对耗时,借助FileSystemCache,一旦生成segment文件,就能通过索引查询到了refresh完,memory bu…

linux部署Whisper 视频音频转文字

github链接&#xff1a;链接 我这里使用anaconda来部署&#xff0c;debian12系统&#xff0c;其他linux也同样 可以使用gpu或者cpu版本&#xff0c;建议使用n卡&#xff0c;rtx3060以上 一、前期准备 1.linux系统 链接&#xff1a;debian安装 链接&#xff1a;ubuntu安装 …

论文阅读:A Software Platform for Manipulating theCamera Imaging Pipeline

论文代码开源链接&#xff1a; A Software Platform for Manipulating the Camera Imaging Pipelinehttps://karaimer.github.io/camera-pipeline/摘要&#xff1a;论文提出了一个Pipline软件平台&#xff0c;可以方便地访问相机成像Pipline的每个阶段。该软件允许修改单个模块…

【科研绘图】Matplotlib 教学

以下是一个针对 Matplotlib 教学 的博客结构&#xff0c;按照分步骤教学方式撰写&#xff0c;以帮助读者从基础到高级逐步掌握 Matplotlib。 Matplotlib 教学&#xff1a;从基础到进阶绘图 Matplotlib 是 Python 中功能强大的数据可视化库&#xff0c;可以用来绘制多种类型的图…

【网络系统管理】2023年全国职业院校技能大赛:组策略--10套题组合--4

16、只有域管理员和IT部门员工可以登陆服务器 (1)计算机配置\策略\Windows设置\安全设置\本地策略\用户权限分配 17、创建ChinaSkills23为GPO管理员,加入到企业管理、域控管理员组 (1)gpmc.msc\林\域\%domain%--在这个域中创建GPO 18、为所有域用户设置漫游文件 (1)用…

钉钉授权登录

一.找开钉钉开发平台【钉钉开放平台 (dingtalk.com)】 二。点击菜单【应用开发】->左边【钉钉应用】->【创建应用】 三。创建应用-》保存成功后&#xff0c;点击自己【新建的应用】&#xff0c;进入详细页面 四。进入应用详细页面。左边【分享设置】 注意&#xff1a;进…

应用系统开发(14) 涡流检测系统硬件设计

涡流检测整体系统架构 涡流检测系统整体结构如上图 所示,DAC 转换与功率放大电路将数字正弦信号转 换为模拟正弦信号,为涡流探头提供正弦激励。互感式探头由两个线圈组成,一个作为 激励,另一个接收检测信号,AD 转换电路将传感器探头感应到的电压滤波放大,将电 压值调整到…

介绍一下strupr(arr);(c基础)

hi , I am 36 适合对象c语言初学者 strupr(arr)&#xff1b;函数是把arr数组变为大写字母 格式 #include<string.h> strupr(arr); 返回值为arr 链接分享一下arr的意义(c基础)(必看)(牢记)-CSDN博客 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl…

人工智能之数学基础:向量的基本知识

本文重点 向量的基本性质是线性代数和向量空间理论的核心,它们为向量运算提供了坚实的基础,并在物理、工程、计算机图形学等领域有着广泛的应用。本文对向量的一些基本知识进行介绍,帮助大家快速理解向量。 向量的定义与表示 向量是一个既有大小又有方向的量,通常用带箭…

Redis中的zset底层实现

文章目录 Redis中的zset底层实现一、引言二、zset的底层实现1、ziplist编码1.1、代码示例 2、skiplist编码2.1、代码示例 三、总结 Redis中的zset底层实现 一、引言 Redis的有序集合&#xff08;zset&#xff09;是一种非常强大的数据结构&#xff0c;它不仅能够存储元素&…

TSmaster CAN/CANFD 诊断(Diagnostic_CAN)

文章目录 1、Diagnostic TP 参数配置1.1 传输层参数&#xff1a;1.2 服务层参数1.3 Seed&Key 2、基础诊断配置2.1 添加/删除 服务2.2 配置 BasicDiagnostic 服务参数 3、诊断控制台4、自动诊断流程4.1 流程用例管理4.2 配置诊断流程&#xff08;UDS Flow&#xff09;4.2.1 …

大语言模型---LoRA中损失值的计算

文章目录 概要损失计算流程小结 概要 Llama-7B模型的LoRA微调训练中&#xff0c;通过使用Cross-Entropy Loss来度量模型输出的预测分布和真实标签分布之间的距离&#xff0c;来衡量模型的准确性。 本文主要介绍LoRA中损失值的计算流程。 Cross-Entropy Loss作用&#xff1a;是…

Linux笔记--基于OCRmyPDF将扫描件PDF转换为可搜索的PDF

1--官方仓库 https://github.com/ocrmypdf/OCRmyPDF 2--基本步骤 # 安装ocrmypdf库 sudo apt install ocrmypdf# 安装简体中文库 sudo apt-get install tesseract-ocr-chi-sim# 转换 # -l 表示使用的语言 # --force-ocr 防止出现以下错误&#xff1a;ERROR - PriorOcrFoundE…