- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我有一个由 L、T 和 A 组成的大约一千个字符的字符串。我很确定其中有一个简单的模式,我想知道是否有任何快速简便的方法可以找到它。此字符串发生变化,因此这不仅仅是一次关闭。
我正在寻找的模式是例如如果字符串是
LLLLLLLLAATAALLLLALLLLLLAATAALLLATLLLLLAATAALLAALLLLLAATAALL
子字符串 LLLLLAATAALL
在此字符串中重复了 4 次。我想搜索这样的子字符串,但我不知道它们在主字符串中的开始位置、结束位置、数量以及它们的长度。
如果 Java 中有任何工具可以查找此类内容,我们将不胜感激。
新的
câu trả lời hay nhất
好的,所以我从 đây 中获取了代码并对其进行调整以跟踪和打印最长的重复子字符串。只需使用 JUnit 运行它。
/* Copyright (c) 2010 the authors listed at the following URL, and/or
the authors of referenced articles or incorporated external code:
http://en.literateprograms.org/Suffix_tree_(Java)?action=history&offset=20100123220137
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Retrieved from: http://en.literateprograms.org/Suffix_tree_(Java)?oldid=16641
*/
nhập java.util.ArrayList;
import java.util.Collection;
nhập java.util.List;
import org.junit.Test;
public class SuffixTree {
@Bài kiểm tra
public void sampleUsage() {
AbstractSuffixTree tree = new SimpleSuffixTree(
"LLLLLLLLAATAALLLLALLLLLLAATAALLLATLLLLLAATAALLAALLLLLAATAALL");
System.out.println("Longest repeating substring "
+ tree.best.printResult() + " repetitions=" + tree.best.visits
+ " length=" + tree.best.stringDepth);
}
}
abstract class AbstractSuffixTree {
SuffixTreeNode best;
String text = null;
SuffixTreeNode root = null;
int inputAlphabetSize = -1;
AbstractSuffixTree(String text) {
if (text.length() > 0 && text.charAt(text.length() - 1) == '$') {
this.text = text;
} khác {
this.text = text + "$";
}
}
}
class SimpleSuffixTree extends AbstractSuffixTree {
public SimpleSuffixTree(String text) {
super(text);
constructTree();
}
private void constructTree() {
super.root = new SuffixTreeNode(this);
best = root;
char[] s = super.text.toCharArray();
for (int i = 0; i < s.length; i++) {
List suffixList = new ArrayList();
for (int k = i; k < s.length; k++) {
suffixList.add(s[k] + "");
}
super.root.addSuffix(suffixList, i + 1);
}
}
}
class CompactSuffixTree extends AbstractSuffixTree {
public CompactSuffixTree(SimpleSuffixTree simpleSuffixTree) {
super(simpleSuffixTree.text);
super.root = compactNodes(simpleSuffixTree.root, 0);
super.best = simpleSuffixTree.best;
}
private SuffixTreeNode compactNodes(SuffixTreeNode node, int nodeDepth) {
node.nodeDepth = nodeDepth;
for (SuffixTreeNode child : node.children) {
while (child.children.size() == 1) {
SuffixTreeNode grandchild = child.children.iterator().next();
child.incomingEdge.label += ", "
+ grandchild.incomingEdge.label;
child.stringDepth += grandchild.incomingEdge.label.length();
child.children = grandchild.children;
// for (SuffixTreeNode grandchild : child.children)
grandchild.parent = node;
}
child = compactNodes(child, nodeDepth + 1);
}
return node;
}
}
class SuffixTreeNode {
AbstractSuffixTree tree;
SuffixTreeEdge incomingEdge = null;
int nodeDepth = -1;
int label = -1;
Collection children = null;
SuffixTreeNode parent = null;
int stringDepth;
int id = 0;
public static int c;
public int visits = 1;
public SuffixTreeNode(AbstractSuffixTree tree, SuffixTreeNode parent,
String incomingLabel, int depth, int label, int id) {
children = new ArrayList();
incomingEdge = new SuffixTreeEdge(incomingLabel, label);
nodeDepth = depth;
this.label = label;
this.parent = cha mẹ;
stringDepth = parent.stringDepth + incomingLabel.length();
id này = id;
this.tree = tree;
}
public SuffixTreeNode(AbstractSuffixTree tree) {
children = new ArrayList();
nodeDepth = 0;
label = 0;
this.tree = tree;
}
public void addSuffix(List suffix, int pathIndex) {
SuffixTreeNode insertAt = this;
insertAt = search(this, suffix);
insert(insertAt, suffix, pathIndex);
}
private SuffixTreeNode search(SuffixTreeNode startNode, List suffix) {
if (suffix.isEmpty()) {
ném ra ngoại lệ IllegalArgumentException mới
"Empty suffix. Probably no valid simple suffix tree exists for the input.");
}
Collection children = startNode.children;
for (SuffixTreeNode child : children) {
if (child.incomingEdge.label.equals(suffix.get(0))) {
suffix.remove(0);
child.visits++;
if (child.visits > 1
&& child.stringDepth > tree.best.stringDepth) {
tree.best = child;
}
if (suffix.isEmpty()) {
return child;
}
return search(child, suffix);
}
}
return startNode;
}
private void insert(SuffixTreeNode insertAt, List suffix,
int pathIndex) {
for (String x : suffix) {
SuffixTreeNode child = new SuffixTreeNode(tree, insertAt, x,
insertAt.nodeDepth + 1, pathIndex, id);
insertAt.children.add(child);
insertAt = child;
}
}
công khai String toString() {
StringBuilder result = new StringBuilder();
String incomingLabel = this.isRoot() ? "" : this.incomingEdge.label;
for (int i = 1; i <= this.nodeDepth; i++)
result.append("\t");
if (this.isRoot()) {
c = 1;
this.id = 1;
} khác {
this.id = c;
result.append(this.parent.id + " -> ");
result.append(this.id + "[label=\"" + incomingLabel + "\"]" + "("
+ visits + "," + (stringDepth) + ")" + ";\n");
}
for (SuffixTreeNode child : children) {
c++;
child.id = c;
result.append(child.toString());
}
return result.toString();
}
public String printResult() {
if (parent == null) {
return "";
} khác {
return this.parent.printResult() + this.incomingEdge.label;
}
}
public boolean isRoot() {
return this.parent == null;
}
public boolean isLeaf() {
return children.size() == 0;
}
}
class SuffixTreeEdge {
String label = null;
@SuppressWarnings("unused")
private int branchIndex = -1;
public SuffixTreeEdge(String label, int branchIndex) {
this.label = label;
this.branchIndex = branchIndex;
}
}
Đầu ra:
Longest repeating substring LLLLLLAATAALLL repetitions=2 length=14
编辑:对您的评论的回应。
目前我只是跟踪最长的重复 SuffixTreeNode(它是 AbstractSuffixTree 中的一个字段)。您可以修改它,以便它跟踪节点的 SortedQueue,按它们的 stringDepth 排序。
关于Java 字符串模式识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664861/
Tôi đang sử dụng hệ thống con windows của linux, đã cài đặt Ubuntu và bash chạy rất mượt. Tôi đang cố gắng sử dụng make và có vẻ như bash không nhận ra gcc. Đã thử thêm nó vào PATH nhưng không có gì thay đổi. Điều kỳ lạ là - cmd
ImageMagick được cài đặt chính xác. Menu "Tiện ích mở rộng PHP" của WAMP cũng hiển thị php_imagick kèm theo dấu kiểm. phpinfo() không hiển thị bất kỳ hình ảnh nào ngoại trừ các biến môi trường hệ thống và Apache
Tôi đã nghĩ vậy, vì giới hạn trên là 2^n và coi chúng đều là máy hữu hạn, giao điểm của NFA trạng thái n và DFA có trạng thái 2^n trở xuống sẽ hợp lệ. Tôi có sai không? Câu trả lời hay nhất Bạn nói đúng. 2^n là giới hạn trên, do đó kết quả được tạo
Tôi có một tập dữ liệu lớn chứa các giá trị hàng ngày cho biết một ngày cụ thể trong năm có đặc biệt nóng hay không (được biểu thị bằng 1 hoặc 0). Mục tiêu của tôi là xác định chuỗi gồm 3 ngày đặc biệt nóng trở lên và tạo tập dữ liệu mới chứa độ dài của mỗi ngày cũng như ngày bắt đầu và ngày kết thúc.
Tôi có một danh sách các vectơ, mỗi vectơ trông như thế này c("Nhật Bản", "Hoa Kỳ", "quốc gia", "Nhật Bản", "nguồn", "quốc gia", "Anh", "nguồn", "quốc gia"
Có công cụ hoặc phương pháp nào để xác định lỗi tràn bộ đệm trong các mảng được xác định tĩnh (tức là char[1234] thay vì malloc(1234)) không? Tôi đã dành phần lớn thời gian của ngày hôm qua để theo dõi các sự cố và hành vi kỳ lạ mà cuối cùng hóa ra là do dòng sau gây ra: // e
Tôi đã cố gắng tạo các ký tự đại diện Snakemake theo cách thủ công bằng cách nhập tệp được phân cách bằng tab như thế này: các loài mẫu tập dữ liệu frr PRJNA493818_GSE120639_SRP1628
Tôi đã cố gắng tạo các ký tự đại diện Snakemake theo cách thủ công bằng cách nhập tệp được phân cách bằng tab như thế này: các loài mẫu tập dữ liệu frr PRJNA493818_GSE120639_SRP1628
Tôi muốn ghi lại giọng nói của ai đó và sau đó dựa trên thông tin tôi nhận được về giọng nói của họ, tôi có thể nhận ra người đó nếu họ nói lại! Vấn đề là tôi không có bất kỳ dữ liệu nào về số liệu thống kê (như tần số) gây ra sự khác biệt! bằng giọng nói của con người Thông tin nếu có ai có thể giúp tôi cách nhận dạng giọng nói của ai đó? trong quá trình nghiên cứu
Tôi muốn chương trình của mình nhận ra khi người dùng nhấn "enter" và tiếp tục vòng lặp. Nhưng tôi không biết làm cách nào để chương trình nhận ra "đầu vào". Đã thử hai phương pháp: string enter; string ent = "\n";
Tôi đã tạo tập lệnh Bash nhỏ này có một tham số (tên tệp) và sẽ phản hồi dựa trên phần mở rộng của tệp: #!/bin/bash fileFormat=${1} if [[ ${fileFormat} =~ [F
Tôi đang tìm cách xác định các đối tượng của chế độ xem phụ trong khi lặp lại bên trong vòng lặp for, về cơ bản tôi nhận được contentView từ UITableView bằng cách thực hiện cell.contentView.subviews
Tôi đang cố gắng sử dụng CallKit trong Swift để xác định người gọi. Tôi đang tìm cách xác định người gọi bằng cách thực hiện yêu cầu URL. Ví dụ: +1-234-45-241 gọi cho tôi, tôi muốn nó vào mydomain.
Tôi gọi plugin (khá cũ) là "hộp dày" và mô tả nó như sau: Khi một hộp dày được tạo, nó chứa danh sách nội dung dựa trên truy vấn. Sử dụng JavaScript hoặc jQuery, tôi muốn có thể truy cập giá trị của loại (trong ví dụ trên t
Tôi muốn viết một số mã có thể chấp nhận một số loại đầu vào và nhận dạng nó dưới dạng sóng vuông, sóng tam giác hoặc một loại dạng sóng nào đó. Tôi cũng cần một số cách để tạo ra làn sóng nói trên. Tôi có kinh nghiệm với C/C++, tuy nhiên, tôi không chắc mình sẽ mô phỏng tất cả những điều này như thế nào. Cuối cùng, tôi muốn chuyển đổi nó thành microCo
Tôi đã tạo một vòng lặp for để hiển thị 8 mục trong mỗi phần, nhưng tôi đang cố gắng xác định một số mục nhất định trong vòng lặp. Ví dụ: tôi muốn nhận dạng hai mục đầu tiên, sau đó là mục thứ năm và thứ sáu, nhưng kỹ thuật nhận dạng của tôi có vẻ đúng. vì (int i = 0; tôi
Làm cách nào để xác định UIStoryboard? Lớp này có các phương thức để tạo và khởi tạo, nhưng tôi không thấy @property có tên như vậy. Ví dụ: lấy đối tượng Storyboard + storyboardWithName:b
Cách xác định phiên bản SQLServer2005 bạn đang chạy. Để xác định phiên bản SQLServer2005 bạn đang chạy, hãy sử dụng SQLServer ManagementStudio để kết nối với SQLServer2005 rồi chạy.
Câu hỏi này đã có câu trả lời ở đây: Làm cách nào để kiểm tra xem một đối tượng có phải là một ngày tháng không? (26 câu trả lời) Đã đóng 2 năm trước. Tôi đang sử dụng mô-đun npm bị lỗi null
Tôi đang tạo một ứng dụng sử dụng API nhận dạng hoạt động để theo dõi hoạt động của người dùng ở chế độ nền. Nếu người dùng ở cùng một vị trí trong một khoảng thời gian xác định (ví dụ: 1 giờ), hệ thống sẽ gửi thông báo đẩy cho biết. người dùng đi dạo.
Tôi là một lập trình viên xuất sắc, rất giỏi!