字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配?

91 篇文章 13 订阅
订阅专栏

------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------

字符串匹配这样一个功能,我想对于任何一个开发工程师来说,应该都不会陌生。我们用的最多的就是编程语言提供的字符串查找函数,比如Java中的 indexOf(),Python 中的find()函数等,它们底层就是依赖接下来要讲的字符串匹配算法。

字符串匹配算法很多,我会分四节来讲。今天讲两种比较简单的、好理解的,它们分别是:BF算法和RK算法。下一节我会讲比较难理解的、但更加高效的,它们是BM算法和KMP算法。

这两节讲的都是单模式匹配算法,也就是一个串跟一个串进行匹配。第三节、第四节,我会讲两种多模式匹配算法,也就是在一个串中同时查找多个串,它分分别是Trie树和AC自动机。

今天讲的两个算法中,RK算法是BF算法的改进,它巧妙借助了我们前面讲过的哈希算法,让匹配的效率有了很大的提升。那RK算法是如何借助哈希算法来实现高效字符串匹配的呢?你可以带着这个问题,来学习今天的内容。

BF算法

BF算法中的BF是Brute Force的缩写,中文叫作暴力匹配算法,也叫相互匹配算法。从名字可以看出,这种算法的字符串匹配方式很“暴力”,当然也就 会比较简单、好懂,但相应的性能也不高。

在开始讲这个算法之前,我先定义两个概念,方便我后面讲解。它们分别是主串模式串。这两个概念很好理解,我举个例子你就懂了。

比方说,我们在字符串A中查找字符串B,字符B就是械串。我们把主串的长度记作 n,模式串长度记作 m。因为我们是在主串中查找模式串,所以 n > m 。

作为最简单、最暴力的字符串匹配算法,BF算法思想可以用一句话来概括,那就是,**我们在主串中,检查起始位置分别是0、1、2…n-m且长度为 m 的 n-m+1个子串,看有没有跟模式串匹配的。**看下图你就明白了。
在这里插入图片描述

从上面的算法思想和例子,我们可以看出,在极端情况下,比如主串是“aaaa…aaaaa”(省略号表示有很多重复的字符a),模式串是“aaaab”。我们每次都比对m个字符,要比对 n-m+1次,所以,这种算法的最坏情况时间复杂度是O(m*n)。

尽管理论上,BF算法的时间复杂度很高,是O(m*n),但在实际的开发中,它却是一个比较常用的字符串匹配算法。为什么说呢?原因有两点。

第一,实际的软件开发中,大部分情况下,模式串和主串长度都不会太长。而且每次模式串与主串中的子串匹配的时候,当中途遇到不能匹配的字符的时候,就可以停止了,不需要把 m 个字符都比对一下。所以尽管理论上的最坏情况时间复杂度是O(n*m),但是,统计意义上,大部分情况下,算法执行效率比这个高很多。

第二,相素字符中匹配算法思想简单,代码实现也非常简单。简单意味着不容易出错,如果有bug也容易暴露和修复。在工程中,在满足性能要求的前提下,简单是首选。这也是我们常说的KISS(Keep it Simple and Stupid)设计原则。

所以,在实际的软件开发中,绝大部分情况下,朴素的字符串匹配算法就够用了。

RK算法

RK算法的全称叫 Rabin-Karp 算法,是由它的两位发明者 Rabin 和 Karp 的名字来全名的。这个算法理解起来也不是很难。我个人觉得,它其实就是刚刚讲的 BF 算法的升级版。

我在讲BF算法的时候讲过,如果模式长度为 m,主串长度为 n,那在主串中,就会有 n-m+1个长度为 m 的子串,我们只需要暴力地对比这 n-m+1个子串与模式串,就可以找出主串与模式串匹配的子串。

但是,每次检查主串与子串是否匹配,需要依次比对每个字符,所以 BF 算法的时间复杂度就比较高,是O(n*m)。我们对朴素的字符串匹配算法稍加改造,引入哈希算法,时间复杂度立刻就会降低。

RK算法的思路是这样的:我们通过哈希算法对主串的 n-m+1个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了(这里先不考虑哈希冲突的问题,后面我们会讲到)。因为哈希值是一个数字,数字之间比较是否相等是非常快速的,所以模式串和子串上比较的效率就提高了。在这里插入图片描述

不过,通过哈希算法计算子串的哈希值的时候,我们需要遍历子串的每个字符。尽管模式串与子串比较的效率提高了,但是,算法整体的效率并没有提高。有没有方法可以提高哈希算法计算子串哈希值的效率呢?

这就需要哈希算法设计的非常有技巧了。我们假设要匹配的字符串的字符集中只包含K个字符,我们可以用一个K进制数据来表示一个子串,这个K进制数转化成十进制数,作为子串的哈希值。表述起来有点抽象,我举一个例子,看完你应该就能懂了。

比如要处理的字符串只包含 a-z 这26个小写字母,那我们就用二十六进制表表示一个字符串。我们把 a-z 这26个字符映射到 0-25这26个数字,a就表示0,b就表示1,以此类推,z表示25。

在十进制的表示法中,一个数字的值是通过下面的方式计算出来的。对应到二十六进制,一个包含a到z这26个字符的字符串,计算哈希的时候,我们只需要把进位从10改成26就可以。在这里插入图片描述

这个哈希算法你应该看懂了吧?现在,为了方便解释,在下面的讲解中,我假设字符串中只包含a-z这26个小写字符,我们用二十六进制来表示一个字符串,对应的哈希值就是二十六进制转化成十进制的结果。

这种哈希算法有一个特点,在主串中,相邻两个子串的哈希值的计算公式有一定关系。我这有个例子,你先找一下规律,再看我后面的讲解。
在这里插入图片描述

从这里例子中,我们很容易就能得出这样的规律:相邻两个子串s[i-1] 和 s[i] (i 表示子串在主串中的起始位置,子串的长度都为 m),对应的哈希值计算公式有交集,也就是说,我们可以使用 s[i-1]的哈希值很快的计算出 s[i] 的哈希值。如果用公式表示的话,就是下面这个样子:在这里插入图片描述

这个计算过程中,26m-1这部分的计算,我们可以通过查表的访求来提高效率。我们事物计算好 260、261、262、263…26m-1,并且存储在一个长度为 m 的数组中,公式中的“次方”就对应数组的下标。这样直接从数组中取值,从而省去了计算时间。在这里插入图片描述

我们在开关的时候提过,RK算法的效率要比BF算法高,现在,我们就来分析一下,RK算法的时间复杂度到底是多少呢?

整个RK算法包含两部分,计算子串哈希值和模式串与子串哈希值之间的比较。第一部分,我们前面也分析了,可以通过设计特殊的哈希算法,只需要扫描一遍主串就能计算出所有子串的哈希值了,所以这部分的时间复杂度是O(n)。

模式串哈希值与每个子串哈希值之间的比较的时间复杂度是O(1)。总共需要比较 n-m+1个子串的哈希值,所以,这部分的时间复杂度也是O(n)。所以,RK算法整体的时间复杂度就是O(n)。

这里还有一个问题就是,模式很长,相应的主串中的子串也会很长,通过上面的哈希算法计算得到哈希值就可能很大,如果超过了计算机中整型数据可以表示的范围,那该如何解决呢?

刚刚我们设计的哈希算法是没有散列冲突的,也就是说,一个字符串与一个二十六进制数一一对应,不同的字符串的哈希值肯定不一样。因为我们是基于进制表示一个字符串的,你可以类比成十进制、十六进制来思考一下。实际上,我们为了能将哈希值落在整开型数据范围内,可以牺牲一下,允许哈希冲突。这个时候哈希算法该如何设计的呢?

哈希算法的设计方法很多,我举一个例子说明一下。假设字符串中只包含a-z这26个英文字母,那我们每个字母对应一个数字,比如 a 对应 1,b对应2,以此类推,z对应26.我们可以把字符串中每个字母对应的数字相加,最后得到的和作为哈希值。这种哈希算法产生的哈希值的数据范围就相对要小很多了。

不过,你也应该发现,这种哈希算法的哈希冲突概率也是挺高的。当然,我只是举了一个最简单的设计方法,还有很多更加优化的方法,比如将每一个字母从小到大对应一个素数,而不是1,2,3…这样的自然数,这样冲突的概率就会降低一些。

那现在新的问题来了。之前我们只需要比较一下模式串和子串的哈希值,如果两个值相等,那这个子串就一定可以匹配模式串。但是,当存在哈希冲突的时候,有可能存在这样的情况,子串和模式串的哈希值虽然是相同的,但是两者本身并不匹配。

实际上,解决方法很简单。当我们发现一个子串的哈希值跟模式串的哈希值相等的时候,我们只需要再对比一下子串和模式串本身就好了。当然,如果子串的哈希值与模式串的哈希值不相等,那对应的子串和模式串肯定也是不匹配的,就不需要比对子串和模式串本身了。

所以,哈希算法的冲突概率要相对控制得低一些,如果存在大量冲突,就会导致RK算法的时间复杂度退化,效率下降。极端情况下,如果存在大量的冲突,每次都再对比子串和模式串本身,那时间复杂度就会退化成O(n*m)。但也不要太悲观,一般情况下,冲突不会很多,RK算法的效率还是比BF算法高的。

解答开篇 & 内容小结

BF算法是最简单、粗暴的字符串匹配算法,它的实现思路是,拿模式串与主串中是所有子串匹配,看是否有能匹配的子串。所以,时间复杂度也比较高,是O(n*m),n、m表示主串和模式串的长度。不过,在实际的软件开发中,因为这种算法实现简单,对于处理小规模的字符串匹配很好用。

RK算法是借助哈希算法对BF算法进行改造,即对每个子串分别求哈希值,然后拿子串的哈希传下与模式串的哈希值,减少比较的时间。所以,理想情况下,RK算法的时间复杂度是O(n),跟BF算法相比,效率提高了很多。不过这样的效率取决于哈希算法的设计方法,如果存在冲突的情况下,时间复杂度可能会退化。极端情况下,哈希算法大量冲突,时间复杂度就退化O(n*m)。

常用的字符串哈希函数
dvlinker的技术专栏
01-23 1万+
本文将介绍什么是字符串哈希函数,字符串哈希函数常见用法,以及字符串哈希函数的实现原理和常用算法
32丨字符串匹配基础(上):如何借助哈希算法实现高效字符串匹配?1
08-03
第三节、第四节,我会讲两种多模式串匹配算法,也就是在一个串中同时查找多个串,它们分别是 Trie 树和AC 自动机。今天讲的两个算法中,RK 算法是 BF 算法
字符串的经典hash算法
C++
03-13 1万+
1 概述   链表查找的时间效率为O(N),二分法为log2N,B+ Tree为log2N,但Hash链表查找的时间效率为O(1)。   设计高效算法往往需要使用Hash链表,常数级的查找速度是任何别的算法无法比拟的,Hash链表的构造和冲突的不同实现方法对效率当然有一定的影响,然而Hash函数是Hash链表最核心的部分,本文尝试分析一些经典软件中使用到的字符串Hash函数在执行效率、离散性、
字符串匹配——哈希算法
hydrogend的博客
02-18 995
这是一种优化技巧,用于优化字符串的匹配。是否相等,而是比较二者的哈希值。是哈希基数,相当于把字符串看作。进制数(,哈希函数就是将。的子串,它的哈希值为。的子串,它的哈希值为。我们不直接比较字符串。进制转换为十进制)。
哈希表对字符串高效处理
铭毅天下Elasticsearch
09-27 1万+
哈希表对字符串高效处理         哈希表(散列表)是一种非常高效的查找数据结构,在原理上也与其他的查找不尽相同,它回避了关键字之间反复比较的繁琐,而是直接一步到位查找结果。当然,这也带来了记录之间没有任何关联的弊端。应该说,散列表对于那些查找性能要求高,记录之间关系无要求的数据有非常好的适用性。注意对散列函数的选择和处理冲突的方法。         Hash表是使用 O(1) 时间进
应用哈希字符串问题进行高效处理
Megustas_JJC的博客
04-09 532
往往我们需要牺牲一定的空间为代码来优化时间性能,尽可能的缩短响应时间,也就是我们经常提到的“以空间换时间”。哈希表(散列表)是一种非常高效的查找数据结构,在原理上也与其他的查找不尽相同,它回避了关键字之间反复比较的繁琐,而是直接一步到位查找结果。当然,这也带来了记录之间没有任何关联的弊端。应该说,散列表对于那些查找性能要求高,记录之间关系无要求的数据有非常好的适用性。注意对散列函数的选择和处理冲突的
字符串匹配哈希
love12fly@sina.com
08-26 273
问题描述 有时候我们需要检测某一字符串中是否含有某一子串,如果有,出现在哪个位置。大多数人很容易想到的是:利用双指针,一个作用于原串,一个作用于子串,逐个字符进行匹配,如果匹配到了则两个指针同时后移,如果匹配过程中出现匹配失败,则从上一次匹配的初始位置的下一位开始重新匹配,子串的指针重新回到最初的位置。这种方法虽然想法简单,但代码比较繁琐且容易出错。为了在这一问题上进行优化,便有了下面的哈希法。 基本思想 所谓哈希法,就是对子串取一个哈希值,然后对原串遍历并以子串的长度为单位将原串中每一个字符作为子串开头的
字符串/超大数据的哈希(hash)高效实现
qq_38844835的博客
07-28 948
哈希基本概念。 字符串哈希。 双向循环链表解决哈希冲突。 哈希应用需要注意的一些问题。
哈希算法详解
INGg__的博客
05-16 860
字符串哈希 存储结构、字符串哈希方式 把庞大的空间或者值域、映射到一个比较小的结构 一般数据范围在10510^5105~10610^6106 最简单的用法:快速比较两个字符串是不是相等 我们都知道,如果比较两个数相等这很简单也很快,但是如果要比较两个字符串是不是相等的话,只能每一个字符挨个比较,那必定会很慢 哈希函数就是将一个字符串转换为一个数,那么我们判断两个数就可以了 例如我们要判断一串小写字母是不是先等的,那么我们可以把这一串当成一个26进制的数来看看他们是不是相等的;这是第一种做法 但是这种做法
求解子串匹配问题---hash算法
qq_46425928的博客
11-11 266
哈希算法就是把一个字符串用hash算法得到一个固定的值,再把其它串用同样的方法得到一个值,用二分查找的方式看看有没有一个同样的值,有就说明匹配到了 hash算法模板 #include<bits/stdc++.h> using namespace std; #define ull unsigned long long ull base = 131; ull a[10010]; char s[10010]; int main(){ int n; scanf("%d",&n); for(int
记录几个经典的字符串hash算法
anyifu6885的博客
04-25 302
记录几个经典的字符串hash算法,方便以后查看: 推荐一篇文章: http://www.partow.net/programming/hashfunctions/# (1)暴雪字符串hash 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> ...
 基于布隆过滤器的字符串模糊匹配算法的FPGA实现
01-30
针对该问题,提出了采用Bloom Filter(布隆过滤器)进行字符串模糊匹配方式,利用Bloom Filter将信息流中大部分正常流量过滤掉,从而减轻了后端的字符串精确匹配的压力,降低了系统功耗,大大提高了处理速度。
33丨字符串匹配基础(中):如何实现文本编辑器中的查找功能?1
08-03
当然,你用上一节讲的 BF 算法RK 算法,也可以实现这个功能,但是在某些极端情况下,BF 算法性能会退化的比较严重,而 RK 算法需要用到哈希算法,而设计
C#,字符串匹配(模式搜索)BF(Brute Force)暴力算法的源代码
最新发布
03-22
字符串匹配算法(模式搜索 Pattern Search)的应用于包括但不限于:生物信息学、信息检索、拼写检查、语言翻译、数据压缩、网络入侵检测、论文查重等等等等。字符串匹配算法,就是在一个字符串text中查找是否存在一...
字符串BM算法
01-20
//构建坏字符哈希表,对应字符在模式串中的位置,如相同则靠最右 for(j = m -1; j >= 0; --j) //模式串从后往前匹配 { if(a[i+j] != b[j]) break; //坏字符对应模式串中的下标是j } 出现坏字符时对应模式串的...
最短路径:地图软件是如何计算出最优出行路径的?
热门推荐
every__day的博客
03-18 2万+
------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------ 今天,从地图软件的路径规划问题讲起,带你看看常用的最短路径算法(Shortest Path Algorithm)。 像 Google 地图。百度地图、高德地图这样的地图软件,应该会经常使用吧?如果从家开到公司,你只需要输入起始地址、结束地址,地图就会给你规划一条最优路线。这里的最优,有很多种定义,比如最短路线...
排序(上)——为什么插入排序比冒泡排序更受欢迎?
every__day的博客
10-29 1万+
本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 排序对于每个程序员来说,可能都不会陌生。平常的项目中,也经常遇到排序。按时间复杂度,分成三类,分三节来说 这里,先抛出一个问题。插入排序和冒泡排序的时间复杂度都是O(n2),可实际开发中,为什么我们更倾向于使用插入排序算法呢? 评价一个排序算法, 从效率角度说,要考虑各种时间复杂度;数据量小时,时间复复杂度的系数、常数也要考虑;元素比较...
堆和堆排序:为什么说堆排序没有快速排序快
every__day的博客
01-22 1万+
------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------ 我们今天讲另外一种特殊的树,“堆(Heap)”。堆这种数据结构的应用场景非常多,最经典的莫过于堆排序了。堆排序是一种原地的、时间复杂度为O(nlogn)的排序算法。 前面我们学过快速排序,平均情况下,它的时间复杂度为O(logn)。尽管这两种排序算法的时间复杂度都是O(nlogn),甚至堆排序比快速排序的时间...
索引:如何在海量数据中快速查找某个数据?
every__day的博客
06-05 5116
------ 本文是学习算法的笔记,《数据结构与算法之美》,极客时间的课程 ------ 前面讲过MySQL数据库索引实现原理,底层是依赖B+树这种数据结构来实现的。那类似Redisp 这要的Key-Value数据库中的索引,又是怎么实现的呢?底层依赖的又是什么数据结构呢? 为什么需要索引? 在实际的软件开发中,业务纷繁复杂,功能千变万化,但是,万变不离其宗。如果抛开业务和功能的外壳,其实它们的本...
字符串匹配算法(如kmp算法)和字符串哈希算法
09-19
字符串匹配算法是一种用来查找一个字符串(即目标串)在另一个字符串(即模式串)中的出现位置的算法。其中,KMP算法是一种比较常用的字符串匹配算法。 KMP算法的核心思想是通过利用模式串中已经匹配过的信息,来尽量减少目标串和模式串的比较次数,从而提高匹配效率。它利用一个最长公共前缀和最长公共后缀数组,记录模式串中已经匹配成功的前缀和后缀的长度。通过根据这些信息来移动模式串的位置,避免不必要的比较。 而字符串哈希算法是一种将字符串映射为一个较短的固定长度的数值的算法。通过对字符串的每个字符进行一系列运算,如求幂、取模等,最终得到一个哈希值。这个哈希值可以代表该字符串的特征,不同字符串哈希值一般不会相同。 字符串哈希算法的主要作用是将字符串转化为一个定长的数字,方便在数据结构中进行比较和存储。在字符串匹配中,使用哈希算法可以将目标串和模式串转换为哈希值,然后比较哈希值是否相等来判断是否匹配。由于比较哈希值的时间复杂度较低,使用字符串哈希算法可以提高匹配效率。 总的来说,字符串匹配算法字符串哈希算法都是用来处理字符串匹配的问题。KMP算法通过利用已知信息来减少比较次数,提高匹配效率;而字符串哈希算法则是将字符串转化为哈希值,便于进行比较和存储。两者都在一定程度上提高了字符串匹配的效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • 最短路径:地图软件是如何计算出最优出行路径的? 24066
  • Spring Cloud项目中单数据源改为多数据源 17312
  • 排序(上)——为什么插入排序比冒泡排序更受欢迎? 16848
  • HTML 模板+freemarker渲染 生成PDF(一) 15424
  • 递归树: 如何借助树来求解递归算法的时间复杂度 11513

分类专栏

  • 算法精选
  • 并发编程 33篇
  • JAVA虚拟机 9篇
  • 数据库 36篇
  • javaee 18篇
  • Redis 3篇
  • 左耳听风专栏学习
  • 架构师之路 13篇
  • 算法与数据结构 91篇

最新评论

  • CompletableFuture 的 allOf 方法底层原理是什么

    every__day: 谢谢夸奖表情包

  • CompletableFuture 的 allOf 方法底层原理是什么

    qq_42492038: 文章质量很高。初读,之后找时间细读。

  • semaphore源码解析:信号量到底是个啥?

    every__day: 共同进步,共同进步哈

  • semaphore源码解析:信号量到底是个啥?

    追梦的小伙子!!: 大佬讲的太好了,节省太多时间,又能学到底层。

  • CompletableFuture 的 allOf 方法底层原理是什么

    every__day: 代码太复杂了,这只是我的大概理解,咱们可以多交流下,我说的也不是很全面。文中示例代码,最多只有一个工作线程,会唤醒主线程。

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • ReentrantReadWriteLock到底怎么玩儿?
  • CompletableFuture 源码分析 thenCombine & thenCompose
  • CompletableFuture 的 allOf 方法底层原理是什么
2023年3篇
2022年7篇
2021年20篇
2020年65篇
2019年36篇
2018年39篇
2017年21篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

天下网TXWEB温州市网络推广哪家专业盘锦优化湛江市关键词排名价格林芝企业网站改版保定网站定制多少钱晋城市网页设计公司伊春建网站哪家专业阳江企业网站建设公司深圳网站改版价格邵阳品牌网站设计多少钱盐城网站建设价格南通市seo按天扣费哪家好日照市seo排名公司九江网站搭建推荐绥化市营销网站建设推荐孝感市网站建设推荐梧州网站搭建价格宁德营销网站建设公司德阳市网站开发报价南联seo推荐成都优化哪家专业晋中市建网站推荐白城市网站开发价格布吉seo排名报价永州市网站开发价格杭州网站设计价格汕头seo排名报价陇南企业网站改版阳江企业网站设计鹰潭网站建设公司香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声卫健委通报少年有偿捐血浆16次猝死汪小菲曝离婚始末何赛飞追着代拍打雅江山火三名扑火人员牺牲系谣言男子被猫抓伤后确诊“猫抓病”周杰伦一审败诉网易中国拥有亿元资产的家庭达13.3万户315晚会后胖东来又人满为患了高校汽车撞人致3死16伤 司机系学生张家界的山上“长”满了韩国人?张立群任西安交通大学校长手机成瘾是影响睡眠质量重要因素网友洛杉矶偶遇贾玲“重生之我在北大当嫡校长”单亲妈妈陷入热恋 14岁儿子报警倪萍分享减重40斤方法杨倩无缘巴黎奥运考生莫言也上北大硕士复试名单了许家印被限制高消费奥巴马现身唐宁街 黑色着装引猜测专访95后高颜值猪保姆男孩8年未见母亲被告知被遗忘七年后宇文玥被薅头发捞上岸郑州一火锅店爆改成麻辣烫店西双版纳热带植物园回应蜉蝣大爆发沉迷短剧的人就像掉进了杀猪盘当地回应沈阳致3死车祸车主疑毒驾开除党籍5年后 原水城县长再被查凯特王妃现身!外出购物视频曝光初中生遭15人围殴自卫刺伤3人判无罪事业单位女子向同事水杯投不明物质男子被流浪猫绊倒 投喂者赔24万外国人感慨凌晨的中国很安全路边卖淀粉肠阿姨主动出示声明书胖东来员工每周单休无小长假王树国卸任西安交大校长 师生送别小米汽车超级工厂正式揭幕黑马情侣提车了妈妈回应孩子在校撞护栏坠楼校方回应护栏损坏小学生课间坠楼房客欠租失踪 房东直发愁专家建议不必谈骨泥色变老人退休金被冒领16年 金额超20万西藏招商引资投资者子女可当地高考特朗普无法缴纳4.54亿美元罚金浙江一高校内汽车冲撞行人 多人受伤

天下网TXWEB XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化