[CareerCup] 18.8 Search String 搜索字符串

简介:

18.8 Given a string s and an array of smaller strings T, design a method to search s for each small string in T. 

这道题给我们一个字符串s,和一个字符串数组T,让我们找T中的每一个小字符串在s中出现的位置,这道题很适合用后缀树Suffix Tree来做,LeetCode中有几道关于前缀树(Prefix Tree, Trie)的题,Implement Trie (Prefix Tree)Word Search II,和 Add and Search Word - Data structure design 。前缀树和后缀树比较相似,都是很重要的数据结构,在解决特定问题时非常有效,具体讲解请参见这个帖子。参见代码如下:

class SuffixTreeNode {
public:
    unordered_map<char, SuffixTreeNode*> children;
    char value;
    vector<int> indexes;
    
    void insertString(string s, int idx) {
        indexes.push_back(idx);
        if (!s.empty()) {
            value = s[0];
            SuffixTreeNode *child;
            if (children.count(value)) {
                child = children[value];
            } else {
                child = new SuffixTreeNode();
                children[value] = child;
            }
            string remainder = s.substr(1);
            child->insertString(remainder, idx);
        }
    }
    
    vector<int> search(string s) {
        if (s.empty()) return indexes;
        char first = s[0];
        if (children.count(first)) {
            string remainder = s.substr(1);
            return children[first]->search(remainder);
        }
        return {};
    }
};

class SuffixTree {
public:
    SuffixTreeNode *root = new SuffixTreeNode();
    
    SuffixTree(string s) {
        for (int i = 0; i < s.size(); ++i) {
            string suffix = s.substr(i);
            root->insertString(suffix, i);
        }
    }
    
    vector<int> search(string s) {
        return root->search(s);
    }
};

本文转自博客园Grandyang的博客,原文链接: 搜索字符串[CareerCup] 18.8 Search String,如需转载请自行联系原博主。

相关文章
|
1月前
|
存储 缓存 测试技术
CMake String函数:如何巧妙地在cmake中操作字符串
CMake String函数:如何巧妙地在cmake中操作字符串
80 0
|
2月前
|
存储 XML 缓存
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
Java字符串内幕:String、StringBuffer和StringBuilder的奥秘
26 0
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
13天前
|
JavaScript
js 字符串String转对象Object
该代码示例展示了如何将一个以逗号分隔的字符串(`&#39;1.2,2,3,4,5&#39;`)转换为对象数组。通过使用`split(&#39;,&#39;)`分割字符串并`map(parseFloat)`处理每个元素,将字符串转换成浮点数数组,最终得到一个对象数组,其类型为`object`。
|
17天前
|
XML 编解码 数据格式
Python标准数据类型-String(字符串)
Python标准数据类型-String(字符串)
23 2
|
1月前
|
SQL JavaScript
js开发:请解释什么是ES6的模板字符串(template string),并给出一个示例。
ES6的模板字符串以反引号包围,支持变量和表达式插入以及多行书写。例如,插入变量值`Hello, ${name}!`,计算表达式`${num1 + num2}`,以及创建多行字符串。模板字符串保留原始空格和缩进,简化了字符串拼接,提高了代码可读性。
18 6
|
1月前
|
SQL Java
使用java中的String类操作复杂的字符串
使用java中的String类操作复杂的字符串
9 0
|
1月前
String类及相应的字符串操作方法
String类及相应的字符串操作方法
68 1
|
1月前
|
存储 程序员 C++
在C++语言中string-vector的字符串作用类型
在C++语言中string-vector的字符串作用类型
9 0
|
1月前
|
存储 安全 Java
36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法
36、Java 中的 String、StringBuilder、StringBuffer、字符串常量池和 intern 方法
31 0