此题用到了DP。设计dp[i][j][k]表示:为了使得三个字符串s1[1:i],s2[1:j],s3[1:k]
能够互不冲突地在Word of Universe里表达,对应的Word of Universe可以用到的最少的字符数。也就是说,在Word of Universe里面,我们最少用前dp[i][j][k]个字符就能够表达出s1[1:i],s2[1:j],s3[1:k]
(当然可能中间部分字符没有用到)。
dp[i][j][k]
和什么有关呢?显然我们可以考虑dp[i-1][j][k],dp[i][j-1][k],dp[i][j][k-1]
.假设我们考察dp[i-1][j][k],表示在这个位置上,Word of Universe能够包容s1[1:i-1],s2[1:j],s3[1:k]
.显然我们还缺一个ch=s1[i]
的字母。此时如果我们能够预先计算出Word of Universe里面在dp[i-1][j][k]的位置之后,下一个字母是ch的位置,那么这个位置就是一个合理的dp[i][j][k]的候选。同理,我们还可以考察dp[i][j-1][k]和dp[i][j][k-1]。
因此我们预先计算一个next[p][ch],表示Word of Universe在第p个位置后,下一个字母是ch的位置。如果没有下一个字母是ch,那么定义next[p][ch]=n+2,n是Word of Universe的字符数,表示超出了上界。
具体的框架是:我们每读入一个字符串的新字母,比如说是s1,那么说明len(s1)++。理论上对于每一个新数据我们需要更新全部的dp[i][j][k],但事实上,我们只需要固定i=len(s1),更新dp[len(s1)][j][k]就行了,因为其他dp都没有变化。所以这是一个二重循环。