我需要编写一个只接收单个输出(字符串)的算法\程序,并返回所有可能的子字符串和每个子字符串的出现次数。
我设法这样做,使用2 for循环,复杂时间为O(N ^ 2)。
我的问题是 - 是否有更有效的方法以更低的复杂性时间这样做?!
我在这里提供我的代码, enter link description here
或 -
const myString = 'dgfdgwababccgregabcaavbrabcrafsfabcdsdsfhjuuyiuyuitrerttfvbcvretrcw';
const stringLength = myString.length;
var myMap = new Map();
for(var i=0 ; i< stringLength; ++i){
for(var j=0; j< (stringLength - i) ; ++j){
let key = myString.substring(j, i+j+1)
//check if substring already exists
let exists = myMap.get(key);
let count = exists ? exists+1 : 1;
//add elements to the map
myMap.set(myString.substring(j, i+j+1), count)
}
}
//iterate the map and prints the entries
for (var [key, value] of myMap) {
console.log(key + ' = ' + value);
}
答案 0 :(得分:0)
由于可能的不同子串的数量是n ^ 2,因此基本上不能比O(n ^ 2)快。
如果您对最长子串(因此没有明确计算子串的子串)感兴趣至少发生两次,那么在平均时间内以O(n log n)运行的算法更有效。有一些最糟糕的情况,例如,当所有字符都相同时。
我勾勒出算法in this answer的轮廓。提供的答案是针对一组字符串,因此您可以忽略第一步。