Algorithm 字符串的有效排列

Algorithm 字符串的有效排列,algorithm,data-structures,amazon,Algorithm,Data Structures,Amazon,这个问题是在最近的一次亚马逊技术采访中问我的。内容如下:- 给定一个字符串例如:“where am i”和一个有效单词字典,您必须列出该字符串的所有有效的不同排列。有效字符串由字典中存在的单词组成。例如:“we is Hem”,“whim aree”是有效的字符串,因为单词(whim,aree)是字典的一部分。还有一个条件是,仅仅对单词进行重新排列是无效的字符串,即“i am where”不是有效的组合 任务是以最佳方式找到所有可能的此类字符串。正如您所说,空间不起作用,因此可以将输入视为字符列

这个问题是在最近的一次亚马逊技术采访中问我的。内容如下:-

给定一个字符串例如:“where am i”和一个有效单词字典,您必须列出该字符串的所有有效的不同排列。有效字符串由字典中存在的单词组成。例如:“we is Hem”,“whim aree”是有效的字符串,因为单词(whim,aree)是字典的一部分。还有一个条件是,仅仅对单词进行重新排列是无效的字符串,即“i am where”不是有效的组合


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

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

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

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

  • 查找单词的最小/最大长度,以估计我们可能有多少单词,即我们重复出现的深度
  • 将单词转换成地图,加快搜索速度
  • 过滤掉有不可能字符的单词(即我们输入的没有字符)
  • 如果这个词是我们输入的子集,我们可以递归地找到这个词
以下是伪代码:

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);
      }
    }
  }
}
int maxDepth=input.length/min_len;
void findWord(列表过滤器添加、映射输入、列表子集、整数级){
中频(电平<最大深度){
for(映射字:filteredict){
if(子集(输入,字)){
子集。添加(单词);
findWord(filtereddit,removeSubset(输入,字),子集,级别+1);
}
}
}
}
然后,您可以在递归函数中轻松地排列单词


从技术上讲,这个解决方案可以是
O(n**d)
——其中n是字典大小,d是最大深度。但是,如果输入的内容不多也不复杂,我们仍然可以在可行的时间内解决它。

您是否尝试回答此采访问题,如果是,你能分享你已有的代码吗?@TimBiegeleisen我想生成字符串的各种排列,然后用动态规划检查每个排列是否可以分解为有效的单词。字符串中的空格是否算数?@Tony space不算数,有效字符串可以有任意数量的spaces@ACV这是一个简单的字谜解决方案,完全微不足道。我们说的是多词的字谜。