题目是给你一堆域名,其中一些是另一些的parent,比如.com是.youku.com的parent,然后.youku.com是.service.youku.com的parent这样,然后再给你一个网址,让你在那堆域名中找到这个网址的parent里面最长的一个,然后再往前退一个返回。语言有点不好描述,举个栗子:

Domains:[
“.com”,
“.cn”
“.service.com”
“.net”
“.youku.net”
]
.
url: “yeah.hello.youku.net” 这里.net和.youku.net都是这个url的parent,其中最长的是.youku.net,再往前退一个是hello,所以返回“hello.youku.net”

虽然我觉得这道题用set倒着来就可以解决,但是看到一个Trie的做法也很不错

这里TrieNode.val不再是char, 而是String.  children array也变成了Map<String, TrieNode>

 public class LongestSubDomain {
private class TrieNode {
String str;
Map<String, TrieNode> map;
boolean isLeaf;
public TrieNode(String str) {
this.str = str;
this.map = new HashMap<>();
this.isLeaf = false;
}
}
TrieNode root = new TrieNode("#");
public static void main(String[] args) {
LongestSubDomain lsd = new LongestSubDomain();
String[] domains = {".com", ".cn", ".service.com", ".net", ".youku.net"};
String url = "yeah.hello.youku.net";
for (String str : domains) {
lsd.insert(str);
}
String res = lsd.startWith(url);
System.out.println(res);
}
public void insert(String domain) {
String[] temp = domain.split("\\.");
TrieNode node = root;
for (int i = temp.length - 1; i >= 0; i--) {
if (temp[i].length() == 0) continue;
if (node.map.containsKey(temp[i])) {
node = node.map.get(temp[i]);
} else {
TrieNode newNode = new TrieNode(temp[i]);
node.map.put(temp[i], newNode);
node = newNode;
}
}
node.isLeaf = true;
}
public String startWith(String url) {
String[] temp = url.split("\\.");
TrieNode node = root;
String res = "";
int index = temp.length - 1;
for (int i = temp.length - 1; i >= 0; i--) {
if (temp[i].length() == 0) continue;
if (node.map.containsKey(temp[i])) {
res = "." + temp[i] + res;
node = node.map.get(temp[i]);
} else {
if (!node.isLeaf) {
res = "";
} else {
index = i;
}
break;
}
}
return temp[index] + res;
}
}

我的做法:

 package uberOnsite;

 import java.util.*;

 public class LongestParent {
public class TrieNode {
String val;
Map<String, TrieNode> children;
boolean end;
public TrieNode(String str) {
val = str;
children = new HashMap<String, TrieNode>();
end = false;
}
} TrieNode root = new TrieNode(""); public void insert(String str) {
String[] arr = str.split("\\.");
TrieNode node = root;
for (int i=arr.length-; i>=; i--) {
if (arr[i].length() == ) continue;
if (!node.children.containsKey(arr[i])) {
node.children.put(arr[i], new TrieNode(arr[i]));
}
node = node.children.get(arr[i]);
}
node.end = true;
} public String findLongest(String str) {
String[] input = str.split("\\.");
TrieNode node = root;
StringBuffer res = new StringBuffer();
for (int i=input.length-; i>=; i--) {
String cur = input[i];
if (node.children.containsKey(cur)) {
res.insert(, cur);
res.insert(, ".");
node = node.children.get(cur);
}
else {
res.insert(, cur);
return res.toString();
}
}
return "";
} /**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
LongestParent sol = new LongestParent();
String[] domains = {".com", ".cn", ".service.com", ".net", ".youku.net"};
String url = "yeah.hello.youku.net";
for (String each : domains) {
sol.insert(each);
}
String res = sol.findLongest(url);
System.out.println(res);
} }

U面经Prepare: Web Address的更多相关文章

  1. VS Extension: Open Web Address with Visual Studio Browser

    使用VS 打开链接 using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop; ... public ...

  2. Some web Address

    1.可视化算法(Data Structure Visualizations) https://www.cs.usfca.edu/~galles/visualization/Algorithms.htm ...

  3. SharePoint 2013 创建web应用程序报错"This page can’t be displayed"

    错误描述 This page can’t be displayed •Make sure the web address http://centeradmin is correct. •Look fo ...

  4. ASP.NET Web API 实例

    ASP.NET Web API 入门大杂烩 创建Web API解决方案,命名为VCoinWebApi,并且创建了同名的Project,然后,创建一个Empty Project:Models,创建一个W ...

  5. Understanding Responsive Web Design: Cross-browser Compatibility

    http://www.sitepoint.com/understanding-responsive-web-design-cross-browser-compatibility/ In the las ...

  6. SharePoint 2013 创建web应用程序报错&quot;This page can’t be displayed&quot;

    错误描写叙述 This page can't be displayed •Make sure the web address http://centeradmin is correct. •Look ...

  7. kubernetes使用Traefik暴露web服务-转载51cto

    Traefix介绍(摘自网络) traefik 是一个前端负载均衡器,对于微服务架构尤其是 kubernetes 等编排工具具有良好的支持:同 nginx 等相比,traefik 能够自动感知后端容器 ...

  8. Accepting PayPal in games(完整的Paypal在Unity的支付)

      Hello and welcome back to my blog! In this article I’m going to talk about the process of acceptin ...

  9. CentOS6.5上Zabbix3.0的RPM安装【一】-安装并配置Server

    一.Environment OS:CentOS6.5 64bit [桌面版安装] Server端:192.168.201.109 ServerName Clinet端:192.168.201.199 ...

随机推荐

  1. 一、ESP8266入门(基于LUA开发)

    序 一入坑便停不下来... 还挺有意思的哈,233,,,, 资料杂,自己一个一个去找确实浪费了不少时间,而且大多还都是英文的,需要硬着头皮看. 这次实践入门,更是对英语的重要确信无疑.Github必须 ...

  2. Node.js API 学习笔记

    常用 API 学习笔记 url 函数 url.parse: 解析 url 地址 url.resolve: 向 url 地址添加或替换字段 url.format: 生成 url 地址 querystri ...

  3. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数#缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列#要提高 fab 函数的可复用性,最好不要直接打印出数列,而是返 ...

  4. C#创建ActiveX

    因为最近的项目可能会用到调用外部设备,读取信息.为了和现有的BS系统兼容,并以较小的代价满足需求,于是想到了使用ActiveX技术(也有人建议使用Silverlight),这技术虽然比较早了,但还是能 ...

  5. [BZOJ1045][HAOI2008]糖果传递 (环形均分纸牌)

    题意 有n个小朋友坐成一圈,每人有ai个糖果.每人只能给左右两人传递糖果.每人每次传递一个糖果代价为1. 思路 把|s[i]-s[k]|求和即可,s[i]是A的前缀和 s[k]为s数组的中位数时,总值 ...

  6. Nested Dolls 贪心 + dp

    G: Nested Dolls Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 99     Solved: 19 Descript ...

  7. Linux 上安装JDK

    JDK下载 下载 JDK Linux 版本(注意看自己安装 Linux 系统的位数,本人的是64位) 1.oracle 官网下载地址:jdk-7u80-linux-x64.gz(可能需要注册下载,嫌麻 ...

  8. CSSposition属性

    基本html文本 1.  position-static #part1{ width:  200px; height:  200px; background:  gold; } #part2{ pos ...

  9. 图层 & 重排 & 重绘

    图层 浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小,每个图层上有一个或多个节点 渲染 DOM 时 浏览器所做的: 获取 DOM 后分割为多个图层 对每个图层的节点计算样式结果 (Rec ...

  10. amoeba实现读写分离

    amoeba的运行环境依靠java的jdk: 下面执行amoeba的安装不走 # mkdir /usr/local/src/amoeba 上传文件:amoeba-mysql-binary-2.2.0. ...