浏览器地址栏输入提示功能

要求当用户在浏览器的地址栏输入地址时,浏览器能够根据用户输入的历史记录对用户现在的输入进行匹配,提示用户可能要输入的字符。大概意思就是要实现和现在浏览器差不多的效果,比如用户之前输入过aaa,abcd,abcc(简化以下,不考虑前缀”www.”和后缀”.com”),当用户再次在浏览器地址栏输入a时,系统能够提示aaa,aaaa,abcd,abcc。输入ab时,系统能够提示abcd,abcc。

思路:感觉可以用树的结构解决该问题,解决过程如下:

1.数据结构选择

用户输入aaa,aaaa,abcd,abcc,后,内部存储结构为:

树的数据结构为:

class Tree {
	Tree tParent;
	char val;
	boolean flag;
	List<Tree> children;

	Tree(Tree p, char c, boolean b) {
		tParent = p;
		val = c;
		flag = b;
		children = new ArrayList<Tree>();
	}
}

其中flag用于表明是否至此为止可得到一条路径。

2.建树过程。

用户输入aaa,aaaa,abcd,abcc,后,树的变化过程如下图所示:

图V即为存储历史数据aaa&aaaa&abcd&abcc后的最终结果,其中黄色节点即表示flag=true,表明输入的历史数据中存有一条历史数据到黄色节点为止。

3.搜索过程。

以用户输入aa&ac为例。输入aa后,系统在树中找到符号条件的点(即图中红色节点)。以该节点为根遍历,以黄色的点为结尾,即可得到a&aa。加上前缀,即得到最终结果:aaa、aaaa。输入ac后,无法在树中找到ac,因此无提示

4.CODE:

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;

class Tree {
	Tree tParent;
	char val;
	boolean flag;
	List<Tree> children;

	Tree(Tree p, char c, boolean b) {
		tParent = p;
		val = c;
		flag = b;
		children = new ArrayList<Tree>();
	}
}

public class Solution {
	/**
	 * 向root中插入节点,返回插入的节点。插入过程中注意flag的设置
	 *
	 * @param root
	 * @param c
	 * @param b
	 * @return
	 */
	public static Tree insert(Tree root, char c, boolean b) {
		Tree node = new Tree(root, c, b);
		if (!isContain(root.children, node)) {
			root.children.add(node);
		} else {
			for (Tree temp : root.children)
				if (temp.val == node.val) {
					if (b == true)
						temp.flag = b;
					return temp;
				}
		}
		return node;
	}

	/**
	 * 判断children中是否已存在node
	 *
	 * @param children
	 * @param node
	 * @return
	 */
	public static boolean isContain(List<Tree> children, Tree node) {
		for (Tree temp : children) {
			if (temp.val == node.val)
				return true;
		}
		return false;
	}

	/**
	 * 打印以node为根节点的路径
	 *
	 * @param node
	 */
	public static void printPath(Tree node) {
		Queue<Tree> queue = new ArrayDeque<Tree>();
		Tree temp = new Tree(null, '.', false);
		queue.add(node);
		while (queue.size() != 0) {
			temp = queue.poll();
			if (temp.flag == true) {
				Tree ori = new Tree(null, ',', false);
				ori = temp;
				String strTemp = "";
				while (temp.tParent != null) {
					strTemp += temp.val;
					temp = temp.tParent;
				}
				for (int i = strTemp.length() - 1; i >= 0; --i)
					System.out.print(strTemp.charAt(i));
				System.out.println();
				temp = ori;
			}
			for (Tree t : temp.children)
				queue.add(t);
		}
	}

	/**
	 * 查找&遍历
	 *
	 * @param root
	 * @param str
	 */
	public static void SendHint(Tree root, String str) {
		Tree node = searchNode(root, str);
		if (node == null) {
			System.out.println("No Hint");
			return;
		}
		printPath(node);
	}

	/**
	 * 根据输入的string在历史树中进行查找,找到符合条件的节点返回(对该节点进行遍历即可得到最终提示)
	 *
	 * @param root
	 * @param str
	 * @return
	 */
	public static Tree searchNode(Tree root, String str) {
		if (str == null || str.length() == 0)
			return root;
		for (int i = 0; i < str.length(); ++i) {
			for (Tree node : root.children) {
				if (node.val == str.charAt(i)) {
					return searchNode(node, str.substring(i + 1, str.length()));
				}
			}
		}
		return null;
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Tree origin = new Tree(null, '.', false);
		Tree root = new Tree(null, '.', false);
		origin = root;
		String[] str = { "aaa", "aaaa", "abcd", "abcc", "adbc", "adddd" };
		// 建树
		for (String temp : str) {
			for (int i = 0; i < temp.length(); ++i) {
				root = insert(root, temp.charAt(i), (i == temp.length() - 1));
			}
			root = origin;
		}
		// 搜索
		SendHint(origin, "ab");
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-12 06:44:12

浏览器地址栏输入提示功能的相关文章

调出js控制台可以在浏览器地址栏输入about:blank

调出js控制台可以在浏览器地址栏输入about:blank,如果不输入about:blank,直接 打开一个新的页面,有可能输出的结果不准确.也就是说变量有可能被其他的影响到, 造成结果不准确.

chrome浏览器地址栏输入,变成可编辑文本模式

chrome浏览器地址栏输入以下代码: data:text/html,<html contenteditable> 或者 在浏览器开发者控制台console处输入 document.body.contentEditable = true 原文地址:https://www.cnblogs.com/sunbey/p/8372212.html

从浏览器地址栏输入url到页面呈现

举个栗子,从浏览器地址栏输入https://www.baidu.com 到页面呈现百度页面呈现 1.从DNS中得到链接ip地址 ①从浏览器DNS缓存 ②从系统DNS缓存中去,本机系统hosts文件中如果有映射,就返回映射的ip地址 ③从局域网路由器中DNS缓存获取映射地址 ④从DNS服务器缓存获取映射地址 ⑤服务器中查找,com->baidu->www 2.TCP连接,三次握手 ①浏览器发起,询问服务器是否支持响应 ②服务器发起,回复浏览器已准备,可以响应,正在等待 ③浏览器接收到后,发起确认

当你在浏览器地址栏输入一个URL后回车,将会发生的事情?

作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等. 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事- 1. 首先嘛,你得在浏览器里输入要网址: 2. 浏览器查找域名的IP地址 导航的第一步是通过访问的域名找出其IP地址.DNS查找过程如下: 浏览器缓存 – 浏览器会缓存DNS记录一段时间. 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器

500px-An_example_of_theoretical_DNS_recursion_svg在浏览器地址栏输入地址,到浏览器显示页面的过程

作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等. 本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事- 1. 首先嘛,你得在浏览器里输入要网址: 2. 浏览器查找域名的IP地址 导航的第一步是通过访问的域名找出其IP地址.DNS查找过程如下: 域名解析服务器,靠它把你要访问的网址找到然后把信息送到你电脑上.DNS 是域名系统 (Domain Name Syst

从浏览器地址栏输入网址,到网页彻底打开,中间都发生了什么?

这是一道经典面试题,以前我以为只有我喜欢出这道题,后来在微博上发现其他技术大牛也出这道题. 这道题其实测试的不是具体特定的技术,而是对整个上网这个概念以及背后流程的理解. 我先说一下我所理解或者说我所期待的大概的答题要点,后面再解释这道题的目的和意义,实际上所谓上网这个过程分为三个大的区块,一块是客户端,一块是网络传输层,一块是服务端. 从输入网址开始,这个网址在客户端就会有一个解析,首先浏览器如果有钩子,可能会直接对这个网址做出判断和反馈,比如国内大部分第三方浏览器(IE浏览器基础上加壳的那种

仿百度的输入提示功能

/// <reference path="jquery-1.7.1.min.js" /> //实现搜索输入框的输入提示js类 function oSearchSuggest(searchFuc) { var input = $('#txtNaviSearchBox'); var suggestWrap = $('#gov_search_suggest'); var key = ""; var init = function () { input.bind

easyui的combobox根据后台数据实现自动输入提示功能

adauhuehkek最近做项目的时候遇到一个需求,需要在录入数据的时候检索已经存在的数据记录,并从中提取相似的数据进行展示并选择,以提高录入效率,简单的说,这个功能有点像在谷歌.百度搜索框里输入一个关键字,然后自动在下边列举出与关键字相似的信息供选择.好啦,现在功能说完了,下边就直入正题,把两种方法都列出来,以供需要的人去选择使用,其实两种方法的区别之处很小,主要是在返回检索结果时调用方法不一样,一种是map(),另一种是each(),这两个方法的区别我就不说了,简单总结就是map()要从建数

ASP.NET平台下从浏览器地址栏输入之后发生的事

浏览器一般内嵌两个模块: Socket通信模块 → 浏览器将地址栏的数据及其他的数据放入http协议的请求头文件中,Socket将此http请求数据发送到远程服务器端 浏览器引擎渲染模块 → 浏览器接受从服务器返回的http响应头数据以及用户请求的数据渲染成用户所见的界面 ASP.NET开发人员和HttpApplication,HttpContext,HttpRequest,HttpResponse这四个类应该是老熟人了,而ASP.NET事件管道也是ASP.NET程序员耳熟能详的,就笔者自己而言