我正在阅读有关动态编程的问题。问题如下:
将长度为 n 的字符串分解为一系列有效单词。假设有一个数据结构可以告诉您字符串在恒定时间内是否是有效单词。
我以某种方式解决了它,但后来我读到的解决方案如下:
创建一个表 T[N],如果子字符串 [0...i] 可以分解为一系列有效单词,则 T[i] 为真。如果存在 aj,则 T[i] 为真,0<=j<=k-1 其中 T[j] 为真且 S(j,k) 是有效词
这是 DP 的经典公式,但它不是错的吗?不应该是:
如果存在 aj,则 T[i] 为真,0<=j<=k-1 其中 T[j] 为真且 S( j+1 ,k) 是有效词或 S(0,i) 是有效词字?
否则,我看不到如何构建表格,例如对于字符串: 如果我们不考虑这是一个单词并且下一个序列是j = 2 ,itsthe
我们将永远不会有。
我是对的这里?但是我们如何才能找到实际的单词呢?
我为理解而制作的示例代码(从java中 返回子字符串):T[2] = true
its
the
S(2+1, N)
s.substring(i,j)
i including j-1
int i = 0
for(; i < s.length(); i++){
for(int j = 0; j > i; j++){
if(T[j] && dictionary.contains(s.substring(j + 1, i)){
T[i] = true;
break;
}
}
if(dictionary.contains(s.substring(0, i + 1)){
T[i] = true;
}
}