使用动态编程将字符串拆分为单词

时间:2016-11-04 01:54:29

标签: string algorithm split dynamic-programming

在这个问题中,我们将字符串拆分成有意义的单词。我们给了一本字典,看看这个单词是否存在。

我在How to split a string into words. Ex: "stringintowords" -> "String Into Words"?看到了其他一些方法。

我想到了一种不同的方法,并且想知道它是否会起作用。

示例 - itlookslikeasentence

算法

字符串的每个字母对应于DAG中的节点。

将bool数组初始化为False。

在每个节点我们有一个选择 - 如果将当前字母添加到前一个子阵列仍然产生一个有效的单词然后添加它,如果没有,那么我们将从该字母开始一个新单词并设置bool [previous_node ] = True表示一个单词在那里结束。在上面的示例中,bool [1]将设置为true。

这类似于最大子阵列总和问题。

这个算法会起作用吗?

1 个答案:

答案 0 :(得分:2)

不,它不会。您的解决方案在每一步都采用尽可能长的单词,但这并不总是有效。

以下是反例:

假设给定的字符串是。您的算法将采用 。然后, <div class="search-home"> <input type="text" onkeypress="gymhandle(event);" class="form-control gym_search" id="gym" name="gym" placeholder=" Search by Name " > <div class="autosuggest1"></div> <div class="autosuggest"></div> </div> <script> function settextbox(rval){ $('.autosuggest').hide(); $('#gym').val(rval); $('#gym_search2').val(rval); searchGymByName(rval); } $(document).ready(function(){ $('.autosuggest').hide(); $('#gym').keyup(function(e) { var code = (e.keyCode || e.which); // do nothing if it's an arrow key if(code == 37 || code == 38 || code == 39 || code == 40 || code==13) { return; } var search_term = $(this).val(); var getdata = { 'search_term': search_term}; if(search_term!=''){ $.ajax({ url: "<?php echo site_url('hebrew/searchGymAuto');?>", data: getdata, type: 'POST', success: function(data){ $('.autosuggest').show(); $('.autosuggest').html(data); } }); } else { $('.autosuggest').hide(); } }); }); $('.autosuggest').hide(); function searchGymByName(rval) { $('.autosuggest').hide(); var gym_name=rval; $.ajax({ url:"<?php echo site_url();?>hebrew/searchGym", type: "POST", data:{gym_name: gym_name}, success:function(res){ $('html, body').animate({ scrollTop: 0 }, 0); $("#ajax-map").hide(); $("#city").val(''); $("#city1").val(''); $("#ajax-page-hide").show(); $("#ajax-page-hide").html(res); } }); } 作为有效字。 var usernametest=$("#userName").val() var letters = /^(?=.*[A-Za-z])(?=.*\d)[A-Za-z\d]{8,16}$/; if(usernametest.match(letters)) { alert('accepted'); } else { alert('not accepted'); } 不是一个单词,因此它会分割输入:awk '/\\/ && /Script_Command/ {print $0;getline;print $0;next} /Script_Command/ {print $0;next} /\\/ {getline;print $0}' + aturtle。但是,无法将a拆分为一系列有效的英语单词。正确的答案是t + at

其中一种可能正确的解决方案是使用动态编程。我们可以定义一个函数atu,以便at如果可以将输入的第一个urtle字符拆分为有效的单词序列。最初,urtle和其余值为a。如果turtle是所有有效ff(i) = true的有效字,则会从i转换为f(0) = true

P.S。其他类型的贪婪算法也不适用于此。例如,如果您使用最短的单词而不是最长的单词,则它无法处理,例如输入false:无法在f(l)之后拆分f(r)被剥离,但s[l + 1, r] + l显然是一个有效的答案。