2021-02-21:手写代码:高性能路由,也就是一个字符串和多个匹配串进行模糊匹配。一个数组arr里是["a","moonfdd"],字符串"moonfdd"能匹配到,理由是arr里有。字符串"xayy"也能匹配到,理由是arr里的"a",第1个星对应"x",第2个星对应"yy"。

福哥答案2021-02-21:

1.前缀树。字符匹配和星号匹配。abcd和abcd,当左c和右对应的时候,下一步分两种情况,左d和右*对应,左c和右c对应。有代码。

2.ACOK算法。当时和面试官聊的时候,面试官说了ACOK算法,但这个算法在网上没找到。百度了一番,感觉就是Aho-Corasick automaton算法,也就是AC自动机。AC自动机,没找到解法,所以没代码。

代码用golang编写,代码如下:

package main

import "fmt"

func main() {
fmt.Println("力扣208 测试")
trie := Constructor()
trie.Insert("apple")
trie.Search("apple") // 返回 true
trie.Search("app") // 返回 false
trie.StartsWith("app") // 返回 true
trie.Insert("app")
trie.Search("app") // 返回 true
fmt.Println("--------------------")
fmt.Println("高性能路由 测试")
ret := ""
ret = RouteMatching("fudada", []string{"fudada*"})
fmt.Println("ret = ", ret)
ret = RouteMatching("fudada", []string{"fu******da*"})
fmt.Println("ret = ", ret)
ret = RouteMatching("fudada", []string{"fudada**"})
fmt.Println("ret = ", ret) } type TrieNode struct {
pass int
end int
nextMap map[byte]*TrieNode
}
type Trie struct {
root *TrieNode
} /** Initialize your data structure here. */
func Constructor() Trie {
return Trie{root: &TrieNode{nextMap: make(map[byte]*TrieNode)}}
} /** Inserts a word into the trie. */
func (this *Trie) Insert(word string) {
wordLen := len(word)
if wordLen == 0 {
return
}
node := this.root
node.pass++
for i := 0; i < wordLen; i++ { // 从左往右遍历字符
if node.nextMap[word[i]] == nil {
node.nextMap[word[i]] = &TrieNode{nextMap: make(map[byte]*TrieNode)}
}
node = node.nextMap[word[i]]
node.pass++
}
node.end++
} /** Returns if the word is in the trie. */
func (this *Trie) Search(word string) bool {
wordLen := len(word)
if wordLen == 0 {
fmt.Println(false)
return false
}
node := this.root
for i := 0; i < wordLen; i++ { // 从左往右遍历字符
if node.nextMap[word[i]] == nil {
fmt.Println(false)
return false
}
node = node.nextMap[word[i]]
}
fmt.Println(node.end > 0)
return node.end > 0
} /** Returns if there is any word in the trie that starts with the given prefix. */
func (this *Trie) StartsWith(prefix string) bool {
word := prefix
wordLen := len(word)
if wordLen == 0 {
fmt.Println(false)
return false
}
node := this.root
for i := 0; i < wordLen; i++ { // 从左往右遍历字符
if node.nextMap[word[i]] == nil {
fmt.Println(false)
return false
}
node = node.nextMap[word[i]]
}
fmt.Println(node.pass > 0)
return node.pass > 0
} func RouteMatching(url string, fuzzyMatches []string) string {
fuzzyMatchesLen := len(fuzzyMatches)
if fuzzyMatchesLen == 0 && len(url) == 0 {
return ""
}
trie := Constructor()
for i := 0; i < fuzzyMatchesLen; i++ {
trie.Insert(fuzzyMatches[i])
}
return process(url, 0, trie.root, "")
} func process(url string, index int, root *TrieNode, retPre string) string {
urlLen := len(url)
if index >= urlLen {
if root.end > 0 {
return retPre
} else {
if root.nextMap['*'] != nil {
return process(url, index, root.nextMap['*'], retPre+"*")
}
return ""
}
}
ret := ""
//1.匹配字符
if root.nextMap[url[index]] != nil {
ret = process(url, index+1, root.nextMap[url[index]], retPre+url[index:index+1])
if ret != "" {
return ret
}
}
//2.匹配*
if root.nextMap['*'] != nil {
ret = process(url, index, root.nextMap['*'], retPre+"*")
if ret != "" {
return ret
}
ret = process(url, index+1, root, retPre)
if ret != "" {
return ret
}
}
return ret
}

执行结果如下:


左神前缀树java代码

评论

2021-02-21:手写代码:高性能路由,也就是一个字符串和多个匹配串进行模糊匹配。一个数组arr里是["*a*","moonfdd"],字符串"moonfdd"能匹配到,理由是arr里有。字符串"xayy"也能匹配到,理由是arr里的"*a*",第1个星对应"x",第2个星对应"yy"。的更多相关文章

  1. 2019前端面试系列——JS高频手写代码题

    实现 new 方法 /* * 1.创建一个空对象 * 2.链接到原型 * 3.绑定this值 * 4.返回新对象 */ // 第一种实现 function createNew() { let obj ...

  2. ClownFish:比手写代码还快的通用数据访问层

    http://www.cnblogs.com/fish-li/archive/2012/07/17/ClownFish.html 阅读目录 开始 ClownFish是什么? 比手写代码还快的执行速度 ...

  3. 手写代码自动实现自动布局,即Auto Layout的使用

    手写代码自动实现自动布局,即Auto Layout的使用,有需要的朋友可以参考下. 这里要注意几点: 对子视图的约束,若是基于父视图,要通过父视图去添加约束. 对子视图进行自动布局调整,首先对UIVi ...

  4. 如果选择构建ui界面方式,手写代码,xib和StoryBoard间的博弈

    代码手写UI这种方法经常被学院派的极客或者依赖多人合作的大型项目大规模使用. 大型多人合作项目使用代码构建UI,主要是看中纯代码在版本管理时的优势,检查追踪改动以及进行代码合并相对容易一些. 另外,代 ...

  5. .netER的未来路,关于基础是否重要和应该自己手写代码吗?

    http://www.cnblogs.com/onepiece_wang/p/5558341.html#!comments 引用"基础知识的学习,一开始可能是背书,但是在后续若干年的工作过程 ...

  6. 手写代码UI,xib和StoryBoard间的的优劣比较

    在UI制作方面,逐渐分化三种主要流派:使用代码手写UI:使用单个xib文件组织viewController或者view:使用StoryBoard来通过单个或很少的几个文件构建UI.三种方式各有优劣,也 ...

  7. UI到底应该用xib/storyboard完成,还是用手写代码来完成?

    UI到底应该用xib/storyboard完成,还是用手写代码来完成? 文章来源:http://blog.csdn.net/libaineu2004/article/details/45488665 ...

  8. java 手写 jvm高性能缓存

    java 手写 jvm高性能缓存,键值对存储,队列存储,存储超时设置 缓存接口 package com.ws.commons.cache; import java.util.function.Func ...

  9. Appium初始化设置:手写代码连接手机、appium-desktop连接手机

    一.包名获取的三种方式 1)找开发要2)mac使用命令:adb logcat | grep START win使用命令:adb logcat | findstr START 或者可以尝试使用第3条命令 ...

  10. gcd手写代码及STL中的使用方法

    一.手写代码 inline int gcd(int x,int y){ if(y==0) return x; else return(gcd(y,x%y)); } 二.STL中的使用方法 注:在STL ...

随机推荐

  1. Qt Windows上实现毛玻璃效果

    首发于我的个人博客:xie-kang.com 博客内有更多文章,欢迎大家访问 原文地址 前言: 很多人看到这个需求的第一想法都是录制软件窗口后的桌面内容,并且加上个高斯模糊就能实现了. 思路没有错,操 ...

  2. Spring简介-IOC

    目录 1.Spring 1.1.简介 1.2.优点 1.3.组成 1.4.扩展 2.IOC理论推导 1.Spring 1.1.简介 Spring:春天----------->给软件行业带来了春天 ...

  3. 手把手教你基于luatos的4G(LTE Cat.1)模组接入华为云物联网平台

    摘要:本期文章采用了4G LTE Cat.1模块,编程语言用的是lua,实现对华为云物联网平台的设备通信与控制 本文分享自华为云社区<基于luatos的4G(LTE Cat.1)模组接入华为云物 ...

  4. Android笔记--案例:登录界面以及登录逻辑

    登录界面的实现 就是说,界面的绘制,并没有什么难度,只要控制好空间的分配就可以了 登录的逻辑实现 获取验证码.忘记密码的界面跳转.登录的实现: 确认文本框的输入内容是否符合题意:

  5. 本地搭建Stable-Diffusion 教程

    前置条件 有一些python的基础 会使用git 有梯子(最好可以全局代理) Windows系统 + 英伟达1060以上显卡 (mac或者linux 以及电脑是AMD显卡,安装的话,可以自行搜索相关教 ...

  6. Nmap学习

    Nmap学习 一.主机发现 1.全面扫描/综合扫描 nmap -A 192.168.142.201 2.Ping扫描 nmap -sP 192.168.142.0/24 3.免Ping扫描,穿透防火墙 ...

  7. PHP微信三方平台-代公众号发送消息模板

    1.微信三方平台代公众号实现业务接口API文档地址: https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/Offi ...

  8. 购物车,实现增删改查;无bug,还有一个直接修改购物车数量功能未实现

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. 安装KubeOperator并导入现有集群进行管理

    安装KubeOperator并导入现有集群进行管理 介绍 KubeOperator 是一个开源的轻量级 Kubernetes 发行版,专注于帮助企业规划.部署和运营生产级别的 Kubernetes 集 ...

  10. python入门教程之二十一json操作

    JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式 python3 中可以使用 json 模块来对 JSON 数据进行编解码,它包含了两个函数: json. ...