算法说明:以下代码实现了一个名为violentmatch
的函数,该函数采用暴力匹配算法来找到字符串H1
中与字符串H2
完全匹配的子串的起始位置。
函数接受两个HString
类型的参数H1
和H2
。在循环中,它会逐个比较两个字符串中的字符,如果字符匹配,则继续比较下一个字符,否则将i
重置为i-j+2
并将j
重置为1。由于字符串的序列是从1开始的,所以i
和j
也从1开始。当H2
被完全匹配时,返回H1
中匹配子串的起始位置,否则返回0。
i-j+2
是一个用来调整i
的值,以便在字符不匹配时,重新开始暴力匹配的计算公式。在这个暴力匹配算法中,i
和j
分别表示H1
和H2
中当前正在比较的字符的位置。当两个字符匹配时,i
和j
都会增加1,以继续比较下一个字符。但是,当字符不匹配时,我们需要重新开始匹配。
在这种情况下,i
被设置为i-j+2
。这个公式的目的是要跳过已经匹配过的字符,并继续比较下一个字符。举个例子,假设H1
是abcde
,H2
是bcd
,初始时i=1
和j=1
。当比较到第二个字符时,H1
的b
和H2
的b
不匹配,于是i
被设置为1-1+2=2
,然后j
被重置为1,从H1
的第2个字符开始重新匹配。
(以上内容由RACCOON生成后修改)
// 重写index函数
// 不依赖于其他串操作的暴力匹配算法
int violentmatch(HString H1, HString H2)
{
int i = 1, j = 1;
// 当两个字符串都有剩余字符时进行比较
while (i <= H1.length && j <= H2.length)
{
// 如果字符匹配,则继续比较下一个字符,需要注意的是ch是数组,下标从0开始,所以索引需要减1
if (H1.ch[i-1] == H2.ch[j-1])
{
i++;
j++;
}
else
{
// 如果字符不匹配,则将H1向右移动一位,并将H2的起始位置重置为1
i = i - j + 2;
j = 1;
}
}
// 如果H2被完全匹配,则返回H1中匹配的起始位置
// 否则返回0
if (j > H2.length)
{
return (i - H2.length);
}
else
{
return 0;
}
}