【代码向】字符串KMS算法,判断某一字符串是否包含另一字符串
2016-05-13 14:49
363 查看
public static class KMS { #region Defines public const int StringStartIndex = 0; #endregion private static int[] GetNext(string s) { int[] next = new int[s.Length]; //当与首字符不同时继续判断下一个字符是否与首字符相同 next[StringStartIndex] = StringStartIndex - 1; int i = StringStartIndex, j = StringStartIndex - 1; while (i < s.Length - 1) { //前一个或是串内全然不同时重新判断,后一个是串内部分相同时,从相同处尾开始判断 if (j == StringStartIndex - 1 || s[i] == s[j]) { //此时可以避免进行重复判断(及相同的字符判断不同时,索引到前一个相同的字符继续判断是否不同 if (s[++i] != s[++j]) next[i] = j;//此时与之前相同 else next[i] = next[j]; } else j = next[j];//之所以不是初始化为StringStartIndex - 1,是为了避免串内相同串内还有相同串 //例如qwqqaqqwqqqwqqaq,qwqqaq有两处重复,qwq有三处 } return next; } public static int KMS_Index(string b, string c) { int[] next = GetNext(c); int i = StringStartIndex - 1, j = StringStartIndex - 1; while (i < b.Length && j < c.Length) { //或判断的前半句是当与首字符不同时继续判断下一字符(因为++j之后j是StringStartIndex),或判断的后半句是相同时继续判断下一个字符是否相同 if (j == StringStartIndex - 1 || b[i] == c[j]) { ++i; ++j; } else j = next[j]; } if (j == c.Length) return i - c.Length; return -1; } }
相关文章推荐
- C#数据结构之顺序表(SeqList)实例详解
- BAT批处理中的字符串处理详解(字符串截取)
- Lua函数与字符串处理简明总结
- Lua教程(七):数据结构详解
- 解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
- C#数据结构之队列(Quene)实例详解
- C#数据结构揭秘一
- C#数据结构之单链表(LinkList)实例详解
- 数据结构之Treap详解
- asp.net 常用字符串处理方法
- 用C语言举例讲解数据结构中的算法复杂度结与顺序表
- C#数据结构之堆栈(Stack)实例详解
- C#数据结构之双向链表(DbLinkList)实例详解
- JavaScript数据结构和算法之图和图算法
- Java数据结构及算法实例:冒泡排序 Bubble Sort
- Oracle 存储过程总结 二、字符串处理相关函数
- 学习php笔记 字符串处理
- PHP字符串处理的10个简单方法
- PHP5 字符串处理函数大全
- Java数据结构及算法实例:插入排序 Insertion Sort