【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 删除 |
转载于:https://www.cnblogs.com/secbook/archive/2012/04/22/2655017.html
【100题】第三十三 高级字符匹配(和谐系统原理)相关推荐
- 图像处理入门100题(三)
图像处理入门100题(三) 本篇记录了自己写的GIthub上的ImageProcessing 100 Wen的问题21-30的答案,注释里包含了一些自己的感悟.为了方便,注释是用英文写的. 进一步感受 ...
- [Python图像处理] 三十三.图像各种特效处理及原理万字详解(毛玻璃、浮雕、素描、怀旧、流年、滤镜等)...
此文转载自:https://blog.csdn.net/Eastmount/article/details/111568397#commentBox 该系列文章是讲解Python OpenCV图像处理 ...
- C语言100题练习计划 07——用字符*输出字母C的图案
名人说:不要失去信心,只要坚持不懈,就终会有成果的.--钱学森 进度:C/C++语言100题练习计划专栏,目前7/100
- 程序员面试100题之十四:强大的和谐
实现一个挺高级的字符匹配算法: 给一串很长字符串,要求找到符合要求的字符串,例如目的串:123 1******3***2 ,12*****3 这些都要找出来,其实就是类似一些和谐系统..... 这题的 ...
- 【100题】第十三题(输出倒数第k个节点)
一,题目:输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 二,分析:这是某一年的考研试题中,数据结构的一个题.题目本身难度不大. 三,思路:设置两个指针p1,p2; ...
- Java开发笔记(三十三)字符包装类型
正如整型int有对应的包装整型Integer那样,字符型char也有对应的包装字符型Character.初始化字符包装变量也有三种方式,分别是:直接用等号赋值.调用包装类型的valueOf方法.使用关 ...
- 【100题】三十五 求一个矩阵中最大的二维矩阵(元素和最大)
一,题目: 求一个矩阵中最大的二维矩阵(元素和最大).如: 1 2 0 3 4 2 3 4 5 1 1 1 5 3 0 中最大的是: 4 5 5 3 要求:(1)写出算法;(2)分析时间复杂度;(3) ...
- leetcode每日一题第三十三天-剑指 Offer 11. 旋转数组的最小数字(easy)
前言 通过leetcode记录自己每天坚持刷题,以此监督自己的学习.不能放假了就懈怠
- AUTOSAR从入门到精通100讲(三十三)-AutoSar架构中的诊断事件管理
Dem在AutoSar架构中的角色和位置 Dem(Diagnostic Event Manager)诊断事件管理,属于Autosar BSW(Basic Software)中的系统服务,在整个架构中所 ...
最新文章
- 日本电信企业5G部署计划 限制了华为中兴设备的使用
- 利用ASP.NET输出指定内容的WORD、EXCEL、TXT、HTM
- 使用Java8新特性(stream流、Lambda表达式)实现多个List 的笛卡尔乘积 返回需要的List<JavaBean>
- CF思维联系–CodeForces - 225C. Barcode(二路动态规划)
- 查看apk包名和Activity的方法
- node.js之第一天
- 用唯一的颜色id编号实现OpenGL选择功能(OpenGL Selection Using Unique Color IDs )
- zabbix通过OMSA监控Dell服务器
- python selenium click 动态加载_python selenium:不要等到click()命令之后加载页面
- 根据深度优先算法(DFS)和标记数组求全排列
- 如何删除.sys的流氓文件
- 使用matlab计算 洛伦兹方程 的李雅普诺夫指数
- SPSS入门笔记记录
- 转帖:免费完美激活Windows7旗舰版
- 《深入理解java虚拟机》学习笔记之虚拟机即时编译详解
- Nature 曹云龙/谢晓亮等破解新冠病毒趋同进化机制,将为抗新冠病毒添新药!...
- android studio打包apk,jnilibs中的so库未被加载到apk内
- 在人心惶惶的互联网寒冬之季,值得看看《大佛普拉斯》
- 「1.9W字总结」一份通俗易懂的 TS 教程,入门 + 实战!
- 2023山西财经大学计算机考研信息汇总