-6

有効な単語を含む辞書があるとします。

すべてのスペースが削除された入力文字列が与えられた場合、その文字列が有効な単語で構成されているかどうかを判別します。

ディクショナリはO(1)ルックアップを提供するハッシュテーブルであると想定できます。

このための漸化式を教えてください。私は本の中でこの質問を見つけました、しかし本は答えを与えませんか?

4

2 に答える 2

2
IsWordValid(S) = for word in dict:
                    if S.startsWith(word) and IsWordValid(S[word.length:])
                          return true
                 return false
IsWordValid(null) = true
于 2011-04-06T19:00:12.737 に答える
0

これが私が最近のコードゴルフのために開発し始めた数学のコードです。
これは、最小限のマッチング、貪欲ではない、再帰的なアルゴリズムです。つまり、「ペンは剣よりも強力です」(スペースなし)という文は{「ペンは剣よりも強力である可能性があります}:)」を返します。

findAll[s_] :=
  Module[{a = s, b = "", c, sy = "="},
  While[
   StringLength[a] != 0,
   j = "";
   While[(c = findFirst[a]) == {} && StringLength[a] != 0,
    j = j <> StringTake[a, 1];
    sy = "~";
    a = StringDrop[a, 1];
   ];
   b = b <> " " <> j ;
   If[c != {},
    b = b <> " " <> c[[1]];
    a = StringDrop[a, StringLength[c[[1]]]];
   ];
  ];
   Return[{StringTrim[StringReplace[b, "  " -> " "]], sy}];
]

findFirst[s_] :=
  If[s != "" && (c = DictionaryLookup[s]) == {}, 
   findFirst[StringDrop[s, -1]], Return[c]];

サンプル入力

ss = {"twodreamstop", 
      "onebackstop", 
      "butterfingers", 
      "dependentrelationship", 
      "payperiodmatchcode", 
      "labordistributioncodedesc", 
      "benefitcalcrulecodedesc", 
      "psaddresstype", 
      "ageconrolnoticeperiod",
      "month05", 
      "as_benefits", 
      "fname"}

出力

 twodreamstop              = two dreams top
 onebackstop               = one backstop
 butterfingers             = butterfingers
 dependentrelationship     = dependent relationship
 payperiodmatchcode        = pay period match code
 labordistributioncodedesc ~ labor distribution coded es c
 benefitcalcrulecodedesc   ~ benefit c a lc rule coded es c
 psaddresstype             ~ p sad dress type
 ageconrolnoticeperiod     ~ age con rol notice period
 month05                   ~ month 05
 as_benefits               ~ as _ benefits
 fname                     ~ f name

HTH

于 2011-04-06T18:41:52.697 に答える