【问题标题】:Break a string of characters into valid words将一串字符分解为有效的单词
【发布时间】: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 是一个单词并且下一个序列是theS(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


    【解决方案1】:

    这取决于您的符号的含义,特别是用于选择子序列。您混合使用方括号和圆括号,“substring [0...i]”和“S(j+1,k)”;我建议我们始终包括左手索引,而不是右手索引。这有时通过在左侧使用方括号和在右侧使用圆括号来明确:S[0...i)。

    如果我们这样做,那么原始措辞几乎是正确的; i和k之间存在一些混淆,我认为应该是相同的,并且没有正确处理i = 0的情况。 (在相关说明中,我认为您的修改也可能无法正确处理 n = 0 (空字符串)的情况。)

    Create a table T[N] which says that T[i] is true if the substring S[0...i)
    can be broken into a sequence of valid words. T[i] is true iff i = 0 OR
    (there exists a j, 0<=j<i, where T[j] is true AND S[j...i) is a valid word).
    

    【讨论】:

    • 符号不是我的。我只能假设 [0..i] 意味着包含 i ,因为你指出的原因
    【解决方案2】:

    你的所有修正都是正确的。

    如果您想重建实际单词,请再添加一个表格数组,该数组将告诉您用于将t[i] 设置为true 的最后一个单词长度。让我们调用这个数组L[i]

    T[i] 为真,当且仅当存在 a j, 0在第一 如果您在后者中设置 L[i] = j - L[i] = i

    然后添加您只需要从L[n] 递归回来的结尾,其中n 是给定字符串的总长度。

    【讨论】:

    • L中存储的是索引还是长度?
    • @Cratylus 索引。但是,由于您只对拆分整个字符串感兴趣,因此这两者以某种方式重合。但是,即使您有兴趣拆分最长的部分,您也可以使用我建议的方法。
    • 所以L[n] 将给出最后一个单词的索引,然后我转到L[n-1] 获取前一个单词然后L[n-2] 等等?
    • @Cratylus: 不,L[n-L[n]] 是下一个,等等。
    • @WolframH:我无法按照顺序。接下来会发生什么?
    猜你喜欢
    • 1970-01-01
    • 2016-08-21
    • 1970-01-01
    • 2011-07-15
    • 2011-10-17
    • 2011-06-12
    • 1970-01-01
    • 2011-01-13
    相关资源
    最近更新 更多