博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【100题】第三十三 高级字符匹配(和谐系统原理)
阅读量:6524 次
发布时间:2019-06-24

本文共 2270 字,大约阅读时间需要 7 分钟。

一,题目

        给一串很长字符串,要求找到符合要求的字符串,例如目的串:123

        例如:1******3***2 ,12*****3这些都要找出来
                  生活中,比如输入:功    会被和谐的

二,分析:

       自然匹配就是对待匹配的每个字符挨个匹配,设你的待匹配字串长度位n,模式字符串长度位m。对于待匹配字符串中的任意一个字符最坏情况下要匹配m次,也就是说这个字符不在模式字符串中。所以最坏情况下总共是m*n此匹配,时间复杂度就是O(m*n)

       倘若使用hash表对待字符串进行hash处理O(n)的时间复杂度,那么对于模式字符串中的任意字符,仅需一次hash判断就可以得知是否在待匹配字符串中出现。最坏仅需m次就可以得到结果。时间复杂度为O(m)或者O(n);

       与此题相类似:就是给一个很长的字符串str还有一个字符集比如{a,b,c}找出str里包含{a,b,c}的最短子串。要求O(n)?比如,字符集是a,b,c,字符串是abdcaabcx,则最短子串为abc

       用两个变量front rear指向一个的子串区间的头和尾,用一个intcnt[255]={0}记录当前这个子串里字符集a,b,c各自的个数,一个变量sum记录字符集里有多少个了rear一直加,更新cnt[]sum的值,直到 sum等于字符集个数然后front++,直到cnt[]里某个字符个数为0,这样就找到一个符合条件的字串了继续前面的操作,就可以找到最短的了。

        鉴于此题的解答,我给出的答案是,利用哈希表(散列表)即根据关键码值(Key value)而直接进行访问的数据结构。下面源码是给出的基于ASCII码表的和谐过程。如果是汉字的,将会更复杂些。这里没有给出。不过,思路类似。

三,源码

#include 
using namespace std; //强大的和谐系统int main(){ char *src="anbmcj"; char *des="abc"; //创建一个哈希表,并初始化 const int tableSize = 256; //因为ASCII码共有256个 int hashTable[tableSize]; int len,i; for(i = 0; i < tableSize; i++) hashTable[i] = 0; len = strlen(src); for(i = 0; i < len; i++) hashTable[src[i]] = 1; len = strlen(des); for(i = 0; i < len; i++) { if(hashTable[des[i]] == 0)//如果des中的任何一个字母没有,则匹配失败 { cout<<"和谐失败,为正规内容"<
附表:

ASCII值

控制字符

ASCII值

控制字符

ASCII值

控制字符

ASCII值

控制字符

0

NUT

32

(space)

64

@

96

1

SOH

33

65

A

97

a

2

STX

34

66

B

98

b

3

ETX

35

#

67

C

99

c

4

EOT

36

$

68

D

100

d

5

ENQ

37

%

69

E

101

e

6

ACK

38

&

70

F

102

f

7

BEL

39

,

71

G

103

g

8

BS

40

(

72

H

104

h

9

HT

41

)

73

I

105

i

10

LF

42

*

74

J

106

j

11

VT

43

+

75

K

107

k

12

FF

44

,

76

L

108

l

13

CR

45

-

77

M

109

m

14

SO

46

.

78

N

110

n

15

SI

47

/

79

O

111

o

16

DLE

48

0

80

P

112

p

17

DCI

49

1

81

Q

113

q

18

DC2

50

2

82

R

114

r

19

DC3

51

3

83

X

115

s

20

DC4

52

4

84

T

116

t

21

NAK

53

5

85

U

117

u

22

SYN

54

6

86

V

118

v

23

TB

55

7

87

W

119

w

24

CAN

56

8

88

X

120

x

25

EM

57

9

89

Y

121

y

26

SUB

58

:

90

Z

122

z

27

ESC

59

;

91

[

123

{

28

FS

60

<

92

/

124

|

29

GS

61

=

93

]

125

}

30

RS

62

>

94

^

126

~

31

US

63

?

95

127

DEL

NUL 空

VT 垂直制表

SYN 空转同步

SOH 标题开始

FF 走纸控制

ETB 信息组传送结束

STX 正文开始

CR 回车

CAN 作废

ETX 正文结束

SO 移位输出

EM 纸尽

EOY 传输结束

SI 移位输入

SUB 换置

ENQ 询问字符

DLE 空格

ESC 换码

ACK 承认

DC1 设备控制1

FS 文字分隔符

BEL 报警

DC2 设备控制2

GS 组分隔符

BS 退一格

DC3 设备控制3

RS 记录分隔符

HT 横向列表

DC4 设备控制4

US 单元分隔符

LF 换行

NAK 否定

DEL 删除

转载于:https://www.cnblogs.com/secbook/archive/2012/04/22/2655017.html

你可能感兴趣的文章
PowerShell在Exchange2010下交互式创建域用户和邮箱
查看>>
谈谈Ext JS的组件——布局的使用方法续二
查看>>
SELinux管理与配置
查看>>
《统一沟通-微软-实战》-6-部署-5-边缘服务器-2012-07-12-3
查看>>
linux下环境变量配错的解决
查看>>
酷客多企业版后台开放实现BAT三平台打通
查看>>
小程序掘金潮,互联网红利争夺战——2018中国小程序商业生态峰会圆满
查看>>
Exchange日常管理之十六:通讯组与动态通讯组
查看>>
2013喜获MVP殊荣,这个国庆不一样
查看>>
[Android学习笔记二] View转化Bitmap
查看>>
Windows Nano Server安装配置详解03:远程管理Nano Server
查看>>
MySQL主从复制架构及原理
查看>>
在cocos2d-x 3.0中使用物理引擎
查看>>
SFB 项目经验-17-Windows 2012 R2-补丁打到最新-问题-KB2982006
查看>>
北京地铁全线支持NFC,移动支付的新机遇?
查看>>
用hadoop中的libhdfs和fuse-dfs构建快速云存储
查看>>
VMTools和虚拟硬件升级
查看>>
不知道自己不知道(Unknown Unknowns)的知识决定了你的发展
查看>>
Apple Watch的非“智能手表”卖点
查看>>
国航是航空公司吗?
查看>>