题目是给你一堆域名,其中一些是另一些的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. Linux下执行Java程序报错

    在linux下编译java程序,执行javac编译生成class文件时,在centos7终端输入如,javac hello.java    会提示未找到指令,但用java -verison测试环境变量 ...

  2. 咸鱼入门到放弃5--Session和Cookie

    保存会话数据的两种技术 1.Cookie Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器.当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去. ...

  3. 2.使用RNN做诗歌生成

    诗歌生成比分类问题要稍微麻烦一些,而且第一次使用RNN做文本方面的问题,还是有很多概念性的东西~~~ 数据下载: 链接:https://pan.baidu.com/s/1uCDup7U5rGuIlIb ...

  4. 99%的Linux运维工程师必须要掌握的命令及运用

    本为同步于微信公众号[IT行业技术圈]关注即可查看更多相关知识点~ Linux对于程序员来并不陌生,随着图形化界面的深入人心,渐渐地命令行开始淡出了我们的视野,随着时间的推移也变得生疏且陌生起来.在此 ...

  5. git合并分支

    源分支向向目标分支上合并.将fix分支向develop分支上合并

  6. 根Activity启动过程

    --摘自<Android进阶解密> 根Activity启动过程中会涉及4个进程,分别是Zygote进程.Launcher进程.AMS所在进程(SystemServer进程).应用程序进程, ...

  7. C#-导入Excel 内容到 DataTable中

    C#-导入Excel 内容到 DataTable中 直接传入文件路径,支持所有Excel格式. 缺点:如果数据量庞大会很占内存. public static DataTable ImportExcel ...

  8. react-native 打开设置界面

    iOS iOS打开设置还是比较简单的,使用Linking组件即可: Linking.openURL('app-settings:') .catch(err => console.log('err ...

  9. ajax 三种数据格式

    1.JSON(格式要正确,可以引jar包操作) servlet代码 package com.hsp.action; import java.io.IOException; import java.io ...

  10. Tornado-Secure cookie and Session

    这一节涉及的内容有: 1.客户端和服务端操作cookie的方法 2.secure cookie的机制 3.基本/自定义session 文件结构 三个启动文件由下往上对应的分别是三种服务端:使用secu ...