2021.11.14 - 149.键值映射

1. 题目

在这里插入图片描述

2. 思路

(1) 前缀树

  • 定义前缀树结点的数据结构,每个结点包含结点值和长度为26的子结点数组,可以将其看作26叉树。
  • 插入单词时,从根结点开始遍历,寻找下一个单词对应的子结点,若该子结点未实例化,则实例化该子结点,然后调用该子结点的插入方法,当单词全部插入到树中时,更新当前结点的结点值。
  • 搜索单词时,先找到前缀字符串的最后一个字符对应的结点,对该结点进行深度优先搜索,若某个子结点的结点值不为0,则表示该子结点是某个单词的结尾,将该结点值加入结果中即可。

3. 代码

public class Test {
    
    
    public static void main(String[] args) {
    
    
    }
}

class MapSum {
    
    
    private TreeNode root;

    public MapSum() {
    
    
        root = new TreeNode();
    }

    public void insert(String key, int val) {
    
    
        root.insert(key, 0, val);
    }

    public int sum(String prefix) {
    
    
        TreeNode cur = root;
        for (int i = 0; i < prefix.length(); i++) {
    
    
            cur = cur.children[prefix.charAt(i) - 'a'];
            if (cur == null) {
    
    
                return 0;
            }
        }
        return cur.dfs();
    }
}

class TreeNode {
    
    
    public int val;
    public TreeNode[] children;

    public TreeNode() {
    
    
        val = 0;
        children = new TreeNode[26];
    }

    public void insert(String key, int index, int val) {
    
    
        if (index == key.length()) {
    
    
            this.val = val;
            return;
        }
        int letterIndex = key.charAt(index) - 'a';
        if (children[letterIndex] == null) {
    
    
            children[letterIndex] = new TreeNode();
        }
        children[letterIndex].insert(key, index + 1, val);
    }

    public int dfs() {
    
    
        int sum = 0;
        if (val > 0) {
    
    
            sum += val;
        }
        for (int i = 0; i < 26; i++) {
    
    
            if (children[i] != null) {
    
    
                sum += children[i].dfs();
            }
        }
        return sum;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_44021223/article/details/121320711
今日推荐