IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 我要进大厂-算法-第八天(动态规划&贪心~好难呀) -> 正文阅读

[数据结构与算法]我要进大厂-算法-第八天(动态规划&贪心~好难呀)

阅读该文章预计90分钟

一:前缀树

1.1:举个例子说明前缀树

举个例子:

"abc" 加到头节点
如果头节点没有走向a的路,就创建一个a,依次建立a、b、c

“bce" 加到头节点
如果头节点没有走向b的路,就创建b,如果没有b-c的路,依次加入c、e

”abd“ 加入到头节点
头节点有走向a的路,那么来到a,有a-》b,来到b,没有b-d,则b的下面创建一个d

总的来说,依次看看有没有头节点到这个路,如果没有则创建出来

1.2:作用

判断某个字符串,是不是以某个字符串开头的

给出n个字符串,生成一个前缀树
然后再给一个字符串,判断是否存在某个开头(前缀)     ---满足
然后再给一个字符串,判断是否存在该字符串	       ---不满足,需要改造点1
然后再给一个字符串,判断有多少个字符串以它作为前缀   ---不满足,需要改造点2

改造点1:需要增加每个节点有多少个以该节点的字符串结尾的。如果超过0的,那就肯定存在该字符串
改造点2:需要增加每个节点被经过多少次,如果经历过n次,则有n个字符串以它作为前缀

1.3: Java代码


package xyz.fudongyang.basic.class_07.my;

public class Code_01_TrieTree {

    /**
     * 前缀树的节点的数据结构
     */
    public static class TrieNode {
        int path;   // 有多少个节点来过此路径
        int end;    // 有多少个节点以它为结尾
        TrieNode[] next;  // 我的下一个路径有26条

        public TrieNode() {
            // 默认我有26条路 a~z
            this.next = new TrieNode[26];
        }
    }

    /**
     * 前缀树节点
     */
    public static class Trie {
        // 前缀树拥有一个头节点
        TrieNode head;

        public Trie() {
            this.head = new TrieNode();
        }

        // 插入一个字符串
        public void insert(String req) {
            if (req == null) {
                return;
            }
            TrieNode node = head;
            char[] charArray = req.toCharArray();
            for (char c : charArray) {
                // 求出该字符串的字符在a~z的哪一个位置上
                int index = c - 'a';
                if (node.next[index] == null) {
                    // 如果从来没来过,则创建数据
                    node.next[index] = new TrieNode();
                }
                node = node.next[index];
                // 路过该节点的都+1
                node.path++;
            }
            // 以它结尾的都+1
            node.end++;
        }

        // 删除一个字符串
        public void delete(String req) {
            // 当这个字符串存在才删除
            if (search(req) != 0){
                TrieNode node = head;
                char[] charArray = req.toCharArray();
                for (char c : charArray) {
                    int index = c - 'a';
                    // 如果是最后一个来过该元素的,则后序元素也是只来过一次,则删除掉吧
                    if (--node.next[index].path == 0){
                        node.next[index] = null;
                        return;
                    }
                    node = node.next[index];
                }
                // 以它结尾的就要被删掉一次啦
                node.end--;
            }
        }


        // 判断当前字符串是否存在过几次
        public int search(String req) {
            if (req == null){
                return 0;
            }
            TrieNode node = head;
            char[] charArray = req.toCharArray();
            for (char c : charArray) {
                int index = c - 'a';
                if (node.next[index] == null){
                    return 0;
                }
                node = node.next[index];
            }
            return node.end;
        }

        // 判断当前字符串以它开头的有几次
        public int prefixNumber(String req){
            if (req == null){
                return 0;
            }
            TrieNode node = head;
            char[] charArray = req.toCharArray();
            for (char c : charArray) {
                int index = c - 'a';
                if (node.next[index] == null){
                    return 0;
                }
                node = node.next[index];
            }
            return node.path;
        }

    }


    public static void main(String[] args) {
        Trie trie = new Trie();
        System.out.println(trie.search("zuo"));
        trie.insert("zuo");
        System.out.println(trie.search("zuo"));
        trie.delete("zuo");
        System.out.println(trie.search("zuo"));
        trie.insert("zuo");
        trie.insert("zuo");
        trie.delete("zuo");
        System.out.println(trie.search("zuo"));
        trie.delete("zuo");
        System.out.println(trie.search("zuo"));
        trie.insert("zuoa");
        trie.insert("zuoac");
        trie.insert("zuoab");
        trie.insert("zuoad");
        trie.delete("zuoa");
        System.out.println(trie.search("zuoa"));
        System.out.println(trie.prefixNumber("zuo"));

    }

}

二:贪心

2.1:前提知识

贪心策略不要证明


  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:43:11  更:2021-08-21 15:45:03 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:52:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码