时空权衡:利用额外的空间提高字符串匹配的速度

  1 using  System;
  2 using  System.Collections.Generic;
  3 using  System.Text;
  4
  5 namespace  StringFinder
  6 {
  7    class Program
  8    {
  9        static void Main(string[] args)
 10        {
 11            StringFinder sf = new StringFinder("Hello");
 12
 13            int index = sf.FindString("This is a String Finder's Hello World Program");
 14
 15            Console.WriteLine(index);
 16        }

 17
 18        class StringFinder
 19        {
 20            Pattern _pattern;
 21            int _startIndex;
 22            public StringFinder(string pattern)
 23            {
 24                _pattern = new Pattern(pattern);
 25                _startIndex = pattern.Length - 1;
 26            }

 27
 28            public int FindString(string s)
 29            {
 30                int k = 0;
 31                int i = _startIndex;
 32
 33                while (true)
 34                {
 35                    if (s[i - k] == _pattern.GetChar(k))
 36                    {
 37                        k++;
 38
 39                        if (k == _pattern.GetPatternLength())
 40                        {
 41                            return i;
 42                        }

 43                    }

 44                    else
 45                    {
 46                        int temp1 = _pattern[s[i - k]] - k;
 47                        int temp2 = _pattern[s[i]];
 48
 49                        i += temp1 > temp2 ? temp1 : temp2;
 50
 51                        k = 0;
 52
 53                        if (i > s.Length - 1)
 54                        {
 55                            return -1;
 56                        }

 57                    }

 58                }

 59            }

 60        }

 61
 62        class Pattern
 63        {
 64            int[] _pattern;
 65            string _chars;
 66
 67            public Pattern(string pattern)
 68            {
 69                _chars = pattern;
 70                _pattern = new int[(int)Char.MaxValue];
 71
 72                for (int i = 0; i < _pattern.Length; i++)
 73                {
 74                    _pattern[i] = pattern.Length;
 75                }

 76
 77                for (int i = 0; i < pattern.Length; i++)
 78                {
 79                    this[pattern[i]] = pattern.Length - i - 1;
 80                }

 81            }

 82
 83            public char GetChar(int index)
 84            {
 85                int i = _chars.Length - index - 1;
 86                return _chars[i];
 87            }

 88
 89            public int GetPatternLength()
 90            {
 91                return _chars.Length;
 92            }

 93
 94            public int this[char c]
 95            {
 96                set
 97                {
 98                    _pattern[(int)c] = value;
 99                }

100                get
101                {
102                    return _pattern[(int)c];
103                }

104            }

105        }

106    }

107}

108
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值