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

  • 相关阅读:
    zz:android sharedpreferences用法
    Android viewHolder
    Python学习笔记~
    zz:Java多线程编程总结
    zz:Android 2.1 源码结构
    onSaveInstanceState的用法
    zz:如何学习Linux操作系统
    Python学习笔记II
    Python类型转换
    zz:Android应用程序基础
  • 原文地址:https://www.cnblogs.com/secbook/p/2655017.html
Copyright © 2020-2023  润新知