我需要在O(n2)
时间内识别形式为xw(w ^ r)y的字符串,其中xw(w ^ r)y是英文字母表中的小写字符串。
这里,w^r
是w中字符的排列。
例如,字符串rtedafdfa
具有所需的形式,其中x = rte,w = daf,w ^ r = dfa,y是空字符串
我尝试过:
上述情况因某些情况而失败,我对所做的一切都不满意。这是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时间,一个具有更好的时间复杂度。
答案 0 :(得分:0)
我们可以通过以下方式实现