nex[i][j]表示在原串s时第i位后面第一个字母j出现的位置
初始化:
(scanf("%s",s+1);
int len = strlen(s+1)
for(int i=len;i>=1;i--)
{
for(int j=0;j<26;j++) nex[i-1][j] = nex[i][j];
nex[i-1][s[i]-'a'] = i;
}
例如:s = “abbc”
nex[3][a] = nex[3][b] = nex[3][c] = 0
nex[3][c] = 4
nex[2][a] = nex[2][b] = 0
nex[2][c] = nex[3][c] = 4;
nex[2][b] = 3
nex[1][a] = 0
nex[1][b] = nex[2][b] = 3
nex[1][c] = nex[2][c] = 4
nex[1][b] = 2
nex[0][a] = nex[1][a] = 0;
nex[0][b] = nex[1][b] = 3;
nex[0][c] = nex[1][c] = 4;
nex[0][a] = 1
应用 1:
判断是否为字串:
bool ans = ture;
for(int i=0,now=0;a[i];i++)
{
now = nex[i][a[i]-'a'];
if(now==0)
{
ans = false;
break;
}
}