您的位置:首页 > 编程语言

【代码向】字符串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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息