如何连接给定的n个字符串以形成单个字符串,以便在组合两个字符串时,第一个字符串的最后一个字符应与下一个字符串的第一个字符相同。
例如:
输入:ab2c,h23f2,c4dsh
输出:ab2cc4dshh23f2
我尝试使用hashmap有没有更好的解决方案?我无法处理像
这样的情况输入:ab2c,h23fc,c555ab,c4dsh,
输出:ab2cc4dshh23fcc555ab
在上面的示例中,第二个字符串有两种可能性,但是使用c555ab将导致字符串结束。如果在不同层面有很多可能性如何处理它们以便得到正确的答案?
答案 0 :(得分:1)
这是一个简单的欧拉路径问题。
- 绘制一个有
(26+10)
个节点的有向图,每个节点对应一个 小写英文字母(a-z)
和10位数字(0-9)
。- 对于第i个给定的字符串,请画一个从第一个字符开始的边 到字符串的最后一个字符。例如。对于字符串
abcd
-画一条边 从节点a
到节点d
。- 在此图中找到一条欧拉路径。欧拉路径是访问的路径 图的每个边缘一次。
理解在欧拉路径中从边a-b
移到b-c
意味着将两个字符串连接在一起,共同字母为b
,相反的结束字符分别为a
和{ {1}}。
方法的正确性-
一条欧拉路径将恰好一次访问每个边缘,这意味着每个 字符串仅使用一次,并按路径访问的顺序连接 节点。
确保存在欧拉路径,然后仅尝试欧拉路径 算法。
答案 1 :(得分:0)
假设函数被调用concat
并将一个字符串数组pool
作为第一个参数,并将累加器*字符串s
作为第二个参数:
每次进入concat
功能时,您都可以查看以下规则:
pool
为空,则返回s
,因为这是正确答案。s
中的pool
没有可接受的匹配项,则返回null或某些指示符表示输入没有合适的答案。这最终会导致正确的答案,或者输入无效的其他指标值。
*累加器字符串是在递归函数调用之间累加值的字符串。在这种情况下,它将在初始调用中作为空字符串开始,然后在每次调用concat
深入调用堆栈时,它将通过pool
的匹配进行连接。
这是一个小型的javascript实现,如果你运行它会生成一个有点冗长的日志:
function concat(pool, s) {
s = s === undefined ? '' : s;
if (pool.length === 0) {
log("empty pool, s: " + s);
return s;
}
for (let itr = 0; itr < pool.length; ++itr) {
let v = pool[itr];
if (s.length === 0 || v.charAt(0) === s.charAt(s.length - 1)) {
log(s + v + " is a candidate path, searching...");
let ret = concat(nSlice(pool, itr), s + v);
if (ret !== null) {
log("returning non-null ret: " + ret);
return ret;
}
log(s + v + " hit a dead end, continuing...");
} else {
log(s + v + " was not a candidate path, continuing...");
}
}
log("Returning null for given s: " + s);
return null;
}
function nSlice(arr, index) {
let a = arr.slice(0);
a.splice(index, 1);
return a;
}
function log(m) {
console.log(m);
let e = document.createElement('div');
e.innerHTML = m;
document.body.appendChild(e);
}
[
['ab2c', 'h23f2', 'c4dsh'],
['ab2c', 'h23fc', 'c555ab', 'c4dsh'],
['h23fc', 'c555ab', 'c4dsh', 'ab2c']
].forEach(v => {
concat(v);
log("------------------");
});