• 18.8 suffix tree


    给定一个字符串s 和 一个包含较短字符串的数组t,设计一个方法,根据t中的每一个较短的字符换,对s进行搜索。

    思路:基于s建立后缀树,然后在后缀树中进行查找,返回所有可能的索引值。

    import java.util.ArrayList;
    
    public class Question {
        public static void main(String[] args) {
            String testString = "bibs";
            String[] stringList = {"b", "bs", "hi", "bb"};
            SuffixTree tree = new SuffixTree(testString);
            for (String s : stringList) {
                ArrayList<Integer> list = tree.search(s);
                if (list != null) {
                    System.out.println(s + ": " + list.toString());
                }
            }
        }
    }

    /**

    b: [0, 2]

    bs: [2]

    */

     
    import java.util.ArrayList;
    
    public class SuffixTree {
        SuffixTreeNode root = new SuffixTreeNode();
        
        public SuffixTree(String s) {
            for (int i = 0; i < s.length(); i++) {
                String suffix = s.substring(i);
                root.insertString(suffix, i);
            }
        }
        
        public ArrayList<Integer> search(String s) {
            return root.search(s);
        }
    }
    package Question18_8;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    
    public class SuffixTreeNode {
        HashMap<Character, SuffixTreeNode> children = new HashMap<Character, SuffixTreeNode>();
        
        char value;
        ArrayList<Integer> indexes = new ArrayList<Integer>();
        public SuffixTreeNode() { }
        
        public void insertString(String s, int index) {
            indexes.add(index);
            if (s != null && s.length() > 0) {
                value = s.charAt(0);
                SuffixTreeNode child = null;
                if (children.containsKey(value)) {
                    child = children.get(value);
                } else {
                    child = new SuffixTreeNode();
                    children.put(value, child);
                }
                String remainder = s.substring(1);
                child.insertString(remainder, index);
            }
        }
        
        public ArrayList<Integer> search(String s) {
            if (s == null || s.length() == 0) {
                return indexes;
            } else {
                char first = s.charAt(0);
                if (children.containsKey(first)) {
                    String remainder = s.substring(1);
                    return children.get(first).search(remainder);
                }
            }
            return null;
        }
    
    }
  • 相关阅读:
    DropDownList判断值是否存在下拉列表中
    postgre教程
    Cookie seesion 赋值
    Winform定时启动
    ASP.NET数据绑定控件
    ASP.NET常用数据绑定控件优劣总结
    Cards and Joy (dp好题)
    River Hopscotch (二分)
    剪花布条(KMP入门)
    GCD (区间数的质因子打表+容斥原理)
  • 原文地址:https://www.cnblogs.com/jdflyfly/p/3937499.html
Copyright © 2020-2023  润新知