【发布时间】:2012-12-19 19:37:06
【问题描述】:
我正在阅读有关动态编程的问题。问题如下:
将长度为 n 的字符串分解为有效的序列 字。假设有一个数据结构告诉你一个字符串 是常数时间内的有效词。
我以某种方式解决了它,但后来我读到的解决方案如下:
创建一个表 T[N] 表示如果子字符串 T[i] 为真 [0...i] 可以分解为一系列有效的单词。 T[i] 为真当且仅当 存在一个 j, 0
这是 DP 的经典表述,但它不是错的吗?不应该是:
T[i] 为真,当且仅当存在 a j, 0j+1,k) 是一个有效的词OR S(0,i) 是一个有效的词?
否则,我看不到如何构造表格,因为例如对于字符串:itsthe,如果我们不考虑 its 是一个单词并且下一个序列是the 即S(2+1, N) for j = 2。
我在这里吗?但是我们如何才能找到实际的单词呢?
我为理解而编写的示例代码(s.substring(i,j) 在 java 中返回来自 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;
}
}
【问题讨论】:
标签: java algorithm data-structures recursion dynamic-programming