有一个向量:std::vector<char> main {'1','2','3','4','5','6','7','8','9'}
例如,有一个向量std::vector<char> sub {'3','4','5','5','6'}
如您所见,向量在第2 个sub位置进入(从零开始计数)
并且最大进入的长度为3(三个)位置(开头重合,然后)main'3','4','5''5' != '6'
问题:
如何在代码中做到这一点?
有一个向量:std::vector<char> main {'1','2','3','4','5','6','7','8','9'}
例如,有一个向量std::vector<char> sub {'3','4','5','5','6'}
如您所见,向量在第2 个sub位置进入(从零开始计数)
并且最大进入的长度为3(三个)位置(开头重合,然后)main'3','4','5''5' != '6'
问题:
如何在代码中做到这一点?
整个任务简化为只有两个顺序操作,在一个循环中执行:
搜索第一次出现
计算条目的长度
这是一个带有一些注释的示例代码:
计算由 sub + "@" + main 组合组成的向量的 z 函数,其中分隔符 "@" 是两个输入中都不出现的字符。
z[i+sub.size+1]现在找到范围上的最大值i=0..main.size-1(参见指定页面上的“在字符串中搜索子字符串”部分),i 索引将指示位置,即最大值。z - 长度。时间是线性的
O(sub.size + main.size)