#suffix #automata #general #python-bindings #sam #general-sam-py

general-sam

Rust 语言中的通用后缀自动机实现

16 个版本 (1 个稳定版本)

1.0.0 2024年3月27日
0.7.0 2024年2月29日
0.6.1 2023年11月27日
0.5.4 2023年11月24日
0.1.1 2023年10月13日

#251 in 算法

Download history 78/week @ 2024-04-14 93/week @ 2024-04-21 3/week @ 2024-04-28 700/week @ 2024-05-05 215/week @ 2024-05-12 37/week @ 2024-05-19 36/week @ 2024-06-02 18/week @ 2024-06-09 11/week @ 2024-06-16 22/week @ 2024-06-23 109/week @ 2024-06-30 86/week @ 2024-07-07 34/week @ 2024-07-14 81/week @ 2024-07-21 63/week @ 2024-07-28

每月264次下载
用于 mtc-token-healing

MIT/Apache

94KB
2.5K SLoC

general-sam

Crates.io Docs.rs License Build status

Rust 语言中的通用后缀自动机实现。

还提供 Python 绑定和一些实用工具。请查看 general-sam-py

flowchart LR
  init((ε))
  a((a))
  b((b))
  ab((ab))
  bc(((bc)))
  abc((abc))
  abcb((abcb))
  abcbc(((abcbc)))

  init -- a --> a
  init -- b --> b
  a -- b --> ab
  b -- c --> bc
  init -- c --> bc
  ab -- c --> abc
  bc -- b --> abcb
  abc -- b --> abcb
  abcb -- c --> abcbc

字符串 "abcbc" 的后缀自动机。

示例

use general_sam::{GeneralSam, BTreeTransTable};

let sam = GeneralSam::<BTreeTransTable<_>>::from_bytes("abcbc");

// "cbc" is a suffix of "abcbc"
assert!(sam.get_root_state().feed_bytes("cbc").is_accepting());

// "bcb" is not a suffix of "abcbc"
assert!(!sam.get_root_state().feed_bytes("bcb").is_accepting());
use general_sam::{GeneralSam, BTreeTransTable};

let sam = GeneralSam::<BTreeTransTable<_>>::from_chars("abcbc");

let mut state = sam.get_root_state();

// "b" is not a suffix but at least a substring of "abcbc"
state.feed_chars("b");
assert!(!state.is_accepting());

// "bc" is a suffix of "abcbc"
state.feed_chars("c");
assert!(state.is_accepting());

// "bcbc" is a suffix of "abcbc"
state.feed_chars("bc");
assert!(state.is_accepting());

// "bcbcbc" is not a substring, much less a suffix of "abcbc"
state.feed_chars("bc");
assert!(!state.is_accepting() && state.is_nil());
# #[cfg(feature = "trie")] {
use general_sam::{GeneralSam, Trie, BTreeTransTable};

let mut trie = Trie::<BTreeTransTable<_>>::default();
trie.insert("hello".chars());
trie.insert("Chielo".chars());

let sam = GeneralSam::<BTreeTransTable<_>>::from_trie(trie.get_root_state());

assert!(sam.get_root_state().feed_chars("lo").is_accepting());
assert!(sam.get_root_state().feed_chars("ello").is_accepting());
assert!(sam.get_root_state().feed_chars("elo").is_accepting());

assert!(!sam.get_root_state().feed_chars("el").is_accepting());
assert!(!sam.get_root_state().feed_chars("el").is_nil());

assert!(!sam.get_root_state().feed_chars("bye").is_accepting());
assert!(sam.get_root_state().feed_chars("bye").is_nil());
# }

参考文献

许可证

此项目许可协议为以下之一:

任选其一。

此项目的 SPDX 许可协议标识符为 MIT OR Apache-2.0

依赖项

~74KB