接收输入字符串并返回子字符串列表和每个子字符串的出现次数

时间:2018-01-04 15:27:41

标签: javascript string algorithm substring

我需要编写一个只接收单个输出(字符串)的算法\程序,并返回所有可能的子字符串和每个子字符串的出现次数。

我设法这样做,使用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);
}

1 个答案:

答案 0 :(得分:0)

由于可能的不同子串的数量是n ^ 2,因此基本上不能比O(n ^ 2)快。

如果您对最长子串(因此没有明确计算子串的子串)感兴趣至少发生两次,那么在平均时间内以O(n log n)运行的算法更有效。有一些最糟糕的情况,例如,当所有字符都相同时。

我勾勒出算法in this answer的轮廓。提供的答案是针对一组字符串,因此您可以忽略第一步。