【发布时间】:2018-02-27 20:20:39
【问题描述】:
我需要在O(n2) 时间识别 xw(w^r)y 形式的字符串,其中 xw(w^r)y 是英文字母表中的小写字符串。
这里,w^r 是 w 中字符的排列。
例如,字符串 rtedafdfa 是所需的形式,其中 x = rte, w=daf, w^r=dfa, y 是空字符串
我尝试过的:
- 创建了一个位置图,其中键作为字符,值作为索引列表
- 使用上述位置图为出现 >= 2 次的所有字符创建了一个索引列表。
- 对刚刚创建的索引列表进行升序排序
- 丢弃所有连续差不为1的索引
- 从最终的索引列表中划分出 w 和 w^r。
上述方法在某些情况下失败了,我对我所做的一切都不满意。这是javascript中的代码:
let input = "raababaya";
let posMap = {};
for(let i=0;i<input.length;i++) {
if(posMap[input[i]]) {
posMap[input[i]].push(i);
}else {
posMap[input[i]] = [i];
}
} // O(N)
let indexList = [];
for(let char in posMap) {
if(posMap[char].length >= 2) {
// Has chances of permutation
indexList.push(...posMap[char]);
}else {
// No permutation
}
} // Worst case O(N); Best Case O(N/2)
indexList.sort((a,b) => a-b); // nlogn
let finalPos = [];
for(let i=0;i<indexList.length;) {
if(indexList[i+1] && (indexList[i+1] - indexList[i] == 1)) {
finalPos.push(indexList[i]);
finalPos.push(indexList[i+1]);
i += 2;
}else i++;
}
if(finalPos.length >=4 ) {
// Pattern detected
let start = finalPos[0];
let end = finalPos[finalPos.length - 1];
console.log('Pattern detected');
console.log('input: ' + input);
console.log('Permutation detected: ' + input.substr(start,end));
}
上述代码适用于输入应用,但当字符串如下时会失败:
aaaaaaaaababaya
这应该是什么更好的方法?我正在寻找两种解决方案。一个在 N^2 次中,一个具有更好的时间复杂度。
【问题讨论】:
-
在这种情况下
x是什么?只是一系列小写字符? -
同样适用于
y? -
@EvanKnowles 是的。在
raababayax 将是r -
@EvanKnowles 是的。在
raababaya中,y 将是ya -
如果可能有多种解决方案会发生什么?对于像 raabababaaya 这样的情况,y 可以是 ya 或 baaya
标签: javascript string algorithm anagram