字符串

时间:2016-12-18 05:26:44

标签: algorithm data-structures amazon

在最近的亚马逊技术采访中,我问过这个问题。它如下: -

给定一个字符串ex:“where am i”和一个有效单词的字典,你必须列出字符串的所有有效的不同排列。有效字符串包含字典中存在的单词。对于ex:“我们是他”,“whim aree”是有效的字符串,考虑到单词(whim,aree)是字典的一部分。另外一个条件是单词的重新排列不是有效的字符串,即“我在哪里”不是有效的组合。

任务是以最佳方式找到所有可能的字符串。

1 个答案:

答案 0 :(得分:0)

正如您所说,空间不算数,因此输入可以被视为字符列表。输出是单词的排列,所以一个明显的方法就是找到所有有效的单词然后置换它们。

现在问题变成将一个字符列表分成每个形成一个单词的子集,你可以找到一些答案here,以下是我的版本来解决这个子问题。

如果字典不大,我们可以将字典迭代到

  • 找到min_len / max_len的单词,估计我们可能有多少单词,即我们重复的深度
  • 将单词转换为地图以加速搜索;
  • 过滤掉具有不可能的字符的单词(即我们的输入没有的字符);
  • 如果这个单词是我们输入的子集,我们可以递归地找到单词。

以下是伪代码:

$(document).on('click', "#topper", function(event) {
  event.preventDefault();
  var target = $(this).attr('id');
  var $target = $("#" + target);
  console.log($target);
  $('html, body').animate({
    scrollTop: 0
  }, 'slow');
});

然后你可以轻松地在递归函数中排列单词。

从技术上讲,此解决方案可以是int maxDepth = input.length / min_len; void findWord(List<Map<Character, Integer>> filteredDict, Map<Character, Integer> input, List<String> subsets, int level) { if (level < maxDepth) { for (Map<Character, Integer> word : filteredDict) { if (subset(input, word)) { subsets.add(word); findWord(filteredDict, removeSubset(input, word), subsets, level + 1); } } } } - 其中n是字典大小,d是最大深度。但如果输入不是很大而且复杂,我们仍然可以在可行的时间内解决它。