还是以那个学生的例子来说,他是买了很多参考书,做了很多题,可是,也仅仅是如此而已了,他每次做题后,只是对照了一下参考答案,评判个对错。那么,这种反馈就是低质量的反馈,所谓高质量的反馈,应该有一个好的导师,对他的答案进行剖析,告诉他哪里有不足?然后,和他一起分析,给出解决方案,以便下次遇到同样的难题之时,能够不犯相同的错误,也只有这样,才能成长。如果每次训练得不到反馈,或者得到的反馈都是低质量的反馈,那么,这样的训练就是无效的训练。
首先需要明确的是,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("匹配失败");
}
}
}