假设串使用链串存储,使用bf算法实现

img

img


让参考书本例题但是俺真的不会(用java实现,可能是就是真的看不懂,或者上课不认真听?

  • 这个问题的回答你可以参考下: https://ask.csdn.net/questions/7488096
  • 除此之外, 这篇博客: Java从新手到大牛,如何训练?中的 2.有效的训练必然需要高质量的反馈 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 还是以那个学生的例子来说,他是买了很多参考书,做了很多题,可是,也仅仅是如此而已了,他每次做题后,只是对照了一下参考答案,评判个对错。那么,这种反馈就是低质量的反馈,所谓高质量的反馈,应该有一个好的导师,对他的答案进行剖析,告诉他哪里有不足?然后,和他一起分析,给出解决方案,以便下次遇到同样的难题之时,能够不犯相同的错误,也只有这样,才能成长。如果每次训练得不到反馈,或者得到的反馈都是低质量的反馈,那么,这样的训练就是无效的训练。

  • 您还可以看一下 多编程老师的2021版Java线程池教程课程中的 什么是线程池?为什么要使用线程池?小节, 巩固相关知识点

以下内容部分参考ChatGPT模型:


首先需要明确的是,BF算法是一种暴力匹配的算法,它的时间复杂度是O(n*m),其中n是主串的长度,m是模式串的长度。因此,对于较长的字符串来说,BF算法效率较低。

其次,链串是一种基于链表实现的字符串存储方式,每个节点存储一个字符,通过指针进行连接。对于BF算法来说,链串的实现方式与普通字符串并无区别,只需将字符数组改为链表即可。

下面是使用Java语言实现BF算法的代码示例:

public class BF {
    public static int bf(String s, String p) {
        int i = 0;  // 主串的下标
        int j = 0;  // 模式串的下标
        int sLen = s.length();
        int pLen = p.length();
        while (i < sLen && j < pLen) {
            if (s.charAt(i) == p.charAt(j)) {
                // 当前字符匹配成功,继续比较下一个字符
                i++;
                j++;
            } else {
                // 当前字符匹配失败,i回溯到下一个位置,j重置为0
                i = i - j + 1;
                j = 0;
            }
        }
        if (j == pLen) {
            // 匹配成功,返回子串在主串中的起始位置
            return i - j;
        } else {
            // 匹配失败,返回-1
            return -1;
        }
    }
}

对于链串的实现,可以定义一个节点类Node,包含一个字符和一个指向下一个节点的指针。然后定义一个链串类LinkString,包含一个指向头节点的指针和一个表示链串长度的变量。

class Node {
    char data;
    Node next;
    public Node(char data, Node next) {
        this.data = data;
        this.next = next;
    }
}

class LinkString {
    Node head;
    int length;
    public LinkString(String s) {
        if (s != null && s.length() > 0) {
            char[] charArray = s.toCharArray();
            Node node = null;
            for (int i = charArray.length - 1; i >= 0; i--) {
                node = new Node(charArray[i], node);
                length++;
            }
            head = node;
        }
    }
    public int indexOf(String p) {
        LinkString pattern = new LinkString(p);
        Node i = head;
        Node j = pattern.head;
        while (i != null && j != null) {
            if (i.data == j.data) {
                i = i.next;
                j = j.next;
            } else {
                i = i.next;
                j = pattern.head;
            }
        }
        if (j == null) {
            return length - p.length();
        } else {
            return -1;
        }
    }
}

这样,我们就可以使用LinkString类实现BF算法了。

public class Demo {
    public static void main(String[] args) {
        String s = "hello world";
        String p = "world";
        LinkString linkS = new LinkString(s);
        int index = linkS.indexOf(p);
        if (index != -1) {
            System.out.println("匹配成功,起始位置为:" + index);
        } else {
            System.out.println("匹配失败");
        }
    }
}

如果我的建议对您有帮助、请点击采纳、祝您生活愉快