【100题】第三十三 高级字符匹配(和谐系统原理)

一,题目

给一串很长字符串,要求找到符合要求的字符串,例如目的串: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 <iostream> 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<<"和谐失败,为正规内容"<<endl; } } cout<<"您的内容被和谐"<<endl; return 1; //匹配成功 }
附表:

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 删除

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值