【发布时间】:2026-01-26 13:05:04
【问题描述】:
我看到了这个面试问题并试了一下。我被困。面试题是:
给定一个字符串
var s = "ilikealibaba";还有一本字典
var d = ["i", "like", "ali", "liba", "baba", "alibaba"];尽量给 s 留出最小的空间
输出可能是
- 我喜欢阿里巴巴(2位)
- 我喜欢阿里巴巴(3格)
但是选1号
我有一些代码,但在打印时卡住了。 如果您有更好的方法来回答这个问题,请告诉我。
function isStartSub(part, s) {
var condi = s.startsWith(part);
return condi;
}
function getRestStr(part, s) {
var len = part.length;
var len1 = s.length;
var out = s.substring(len, len1);
return out;
}
function recPrint(arr) {
if(arr.length == 0) {
return '';
} else {
var str = arr.pop();
return str + recPrint(arr);
}
}
// NOTE: have trouble to print
// Or if you have better ways to do this interview question, please let me know
function myPrint(arr) {
return recPrint(arr);
}
function getMinArr(arr) {
var min = Number.MAX_SAFE_INTEGER;
var index = 0;
for(var i=0; i<arr.length; i++) {
var sub = arr[i];
if(sub.length < min) {
min = sub.length;
index = i;
} else {
}
}
return arr[index];
}
function rec(s, d, buf) {
// Base
if(s.length == 0) {
return;
} else {
}
for(var i=0; i<d.length; i++) {
var subBuf = [];
// baba
var part = d[i];
var condi = isStartSub(part, s);
if(condi) {
// rest string
var restStr = getRestStr(part, s);
rec(restStr, d, subBuf);
subBuf.unshift(part);
buf.unshift(subBuf);
} else {
}
} // end loop
}
function myfunc(s, d) {
var buf = [];
rec(s, d, buf);
console.log('-- test --');
console.dir(buf, {depth:null});
return myPrint(buf);
}
// Output will be
// 1. i like alibaba (with 2 spaces)
// 2. i like ali baba (with 3 spaces)
// we pick no.1, as it needs less spaces
var s = "ilikealibaba";
var d = ["i", "like", "ali", "liba", "baba", "alibaba"];
var out = myfunc(s, d);
console.log(out);
基本上,我的输出是,不知道如何打印它....
[ [ 'i', [ 'like', [ 'alibaba' ], [ 'ali', [ 'baba' ] ] ] ] ]
【问题讨论】:
-
d 不是字典,它是一个数组。
-
@MihaiAlexandru-Ionut 我很确定他们的意思是“字典”是一个非技术术语(“单词集合”)。
-
这是动态编程中的经典练习 - 我认为它是 Cormen 的“算法简介”或“算法设计手册”的一部分,但我记得在其中之一中看到过。
-
你可以使用 Trie 数据结构
标签: javascript algorithm dictionary