一,题目

给一串很长字符串,要求找到符合要求的字符串,例如目的串: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 删除

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

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

  1. 图像处理入门100题(三)

    图像处理入门100题(三) 本篇记录了自己写的GIthub上的ImageProcessing 100 Wen的问题21-30的答案,注释里包含了一些自己的感悟.为了方便,注释是用英文写的. 进一步感受 ...

  2. [Python图像处理] 三十三.图像各种特效处理及原理万字详解(毛玻璃、浮雕、素描、怀旧、流年、滤镜等)...

    此文转载自:https://blog.csdn.net/Eastmount/article/details/111568397#commentBox 该系列文章是讲解Python OpenCV图像处理 ...

  3. C语言100题练习计划 07——用字符*输出字母C的图案

    名人说:不要失去信心,只要坚持不懈,就终会有成果的.--钱学森 进度:C/C++语言100题练习计划专栏,目前7/100

  4. 程序员面试100题之十四:强大的和谐

    实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3 这些都要找出来,其实就是类似一些和谐系统..... 这题的 ...

  5. 【100题】第十三题(输出倒数第k个节点)

    一,题目:输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 二,分析:这是某一年的考研试题中,数据结构的一个题.题目本身难度不大. 三,思路:设置两个指针p1,p2; ...

  6. Java开发笔记(三十三)字符包装类型

    正如整型int有对应的包装整型Integer那样,字符型char也有对应的包装字符型Character.初始化字符包装变量也有三种方式,分别是:直接用等号赋值.调用包装类型的valueOf方法.使用关 ...

  7. 【100题】三十五 求一个矩阵中最大的二维矩阵(元素和最大)

    一,题目: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)写出算法;(2)分析时间复杂度;(3) ...

  8. leetcode每日一题第三十三天-剑指 Offer 11. 旋转数组的最小数字(easy)

    前言 通过leetcode记录自己每天坚持刷题,以此监督自己的学习.不能放假了就懈怠

  9. AUTOSAR从入门到精通100讲(三十三)-AutoSar架构中的诊断事件管理

    Dem在AutoSar架构中的角色和位置 Dem(Diagnostic Event Manager)诊断事件管理,属于Autosar BSW(Basic Software)中的系统服务,在整个架构中所 ...

最新文章

  1. 日本电信企业5G部署计划 限制了华为中兴设备的使用
  2. 利用ASP.NET输出指定内容的WORD、EXCEL、TXT、HTM
  3. 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>
  4. CF思维联系–CodeForces - 225C. Barcode(二路动态规划)
  5. 查看apk包名和Activity的方法
  6. node.js之第一天
  7. 用唯一的颜色id编号实现OpenGL选择功能(OpenGL Selection Using Unique Color IDs )
  8. zabbix通过OMSA监控Dell服务器
  9. python selenium click 动态加载_python selenium:不要等到click()命令之后加载页面
  10. 根据深度优先算法(DFS)和标记数组求全排列
  11. 如何删除.sys的流氓文件
  12. 使用matlab计算 洛伦兹方程 的李雅普诺夫指数
  13. SPSS入门笔记记录
  14. 转帖:免费完美激活Windows7旗舰版
  15. 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解
  16. Nature 曹云龙/谢晓亮等破解新冠病毒趋同进化机制,将为抗新冠病毒添新药!...
  17. android studio打包apk,jnilibs中的so库未被加载到apk内
  18. 在人心惶惶的互联网寒冬之季,值得看看《大佛普拉斯》
  19. 「1.9W字总结」一份通俗易懂的 TS 教程,入门 + 实战!
  20. 2023山西财经大学计算机考研信息汇总

热门文章

  1. php计算一段时间工作日,PHP计算8小时工作日的一半
  2. Spring Boot 中使用MyBatis Mapper方式(xml)
  3. SpringBoot整合Redis入门
  4. k8s解决coredns 的ImagePullBackOff 和ErrImagePull 问题
  5. ubuntu server设置时区和更新时间
  6. 什么是嵌入式工程师,发展前景如何
  7. 《Go 语言程序设计》读书笔记(十)反射
  8. vc范例-操作mysql数据库_VC范例-操作MySQL数据库
  9. 希尔排序(分而治之)
  10. 魅族魅蓝5s详细开启Usb调试模式的流程