- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我需要获取字符串的所有唯一子字符串。我已将字符串存储到 trie
中,但我无法弄清楚如何使用它来打印所有唯一的子字符串例如
string aab
所有唯一的子串都是{"a", "aa", "aab", "ab", "b"
这是我的trie
代码
#include <iostream>
#include <map>
#include <string>
#include <stack>
struct trie_node_t {
typedef std::map<char, trie_node_t *> child_node_t;
child_node_t m_childMap;
trie_node_t() :m_childMap(std::map<char, trie_node_t*>()) {}
void insert( std::string& word ) {
trie_node_t *pNode = this;
for ( std::string::const_iterator itr = word.begin(); itr != word.end(); ++itr) {
char letter = *itr;
if ( pNode->m_childMap.find(letter) == pNode->m_childMap.end()){
pNode->m_childMap[letter] = new trie_node_t();
}
pNode = pNode->m_childMap[letter];
}
}
void print() {
}
};
int main ( int argc, char **argv ) {
trie_node_t trie;
trie.insert(std::string("aab"));
trie.print();
}
我如何实现打印所有唯一子字符串的 print
函数。
我正在寻找线性时间方法
自从我构建了一个 trie
之后,有什么方法可以让我遍历并且每当我访问任何节点时我都可以将它打印为一个唯一的字符串。
最佳答案
首先,构建一个后缀树。这表示字符串的所有后缀,并且可以在线性时间内完成。由于每个子字符串都是后缀的前缀,现在您需要枚举后缀的前缀。
幸运的是,如果两个后缀共享一个公共(public)前缀,则该前缀将位于从根开始的单个公共(public)路径上,因此树中从根 (*) 开始的路径与唯一后缀之间存在 1-1 映射。
因此,从后缀树中的根开始遍历所有路径以生成所有唯一子字符串就足够了。
(*) 后缀树中的路径被压缩,即一条边可能代表多个字符。您需要解压缩路径以生成所有子字符串,即将压缩的边视为多节点路径。
关于c++ - 生成字符串的所有可能的唯一子串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8785329/
我正在尝试创建一个程序,其中字符串的前三个字符重复给定次数,如下所示: foo('Chocolate', 3) # => 'ChoChoCho' foo('Abc', 3) # => 'AbcAbcA
我有以下字符串: std::string str = "Mode:AAA:val:101:id:A1"; 我想分离一个位于 "val:" 和 ":id" 之间的子字符串,这是我的方法: std::st
DNA 字符串可以是任意长度,包含 5 个字母(A、T、G、C、N)的任意组合。 压缩包含 5 个字母(A、T、G、C、N)的 DNA 字母串的有效方法是什么?不是考虑每个字母表 3 位,我们可以使用
是否有一种使用 levenstein 距离将一个特定字符串与第二个较长字符串中的任何区域进行匹配的好方法? 例子: str1='aaaaa' str2='bbbbbbaabaabbbb' if str
使用 OAuth 并使用以下函数使用我们称为“foo”(实际上是 OAuth token )的字符串加密 key public function encrypt( $text ) { // a
我是一名优秀的程序员,十分优秀!