最小表示法
若长为
则称
原理
不妨记前面的串为
cpp
int k = 0, i = 0, j = 1;
while (k < len && i < len && j < len) {
if (S[(i + k) % len] == S[(j + k) % len]) {
++k;
} else {
if (S[(i + k) % len] > S[(j + k) % len])
i++;
else
j++;
if (i == j)
i++;
k = 0;
}
}
return min(i, j);
int k = 0, i = 0, j = 1;
while (k < len && i < len && j < len) {
if (S[(i + k) % len] == S[(j + k) % len]) {
++k;
} else {
if (S[(i + k) % len] > S[(j + k) % len])
i++;
else
j++;
if (i == j)
i++;
k = 0;
}
}
return min(i, j);
该算法在特殊情况下的最差复杂度是
假设当比对到第
这意味对于
cpp
int k = 0, i = 0, j = 1;
while (k < len && i < len && j < len) {
if (S[(i + k) % len] == S[(j + k) % len]) {
++k;
} else {
if (S[(i + k) % len] > S[(j + k) % len])
i = i + k + 1;
else
j = j + k + 1;
if (i == j)
i++;
k = 0;
}
}
return min(i, j);
int k = 0, i = 0, j = 1;
while (k < len && i < len && j < len) {
if (S[(i + k) % len] == S[(j + k) % len]) {
++k;
} else {
if (S[(i + k) % len] > S[(j + k) % len])
i = i + k + 1;
else
j = j + k + 1;
if (i == j)
i++;
k = 0;
}
}
return min(i, j);