bigO算法的时间复杂度,该算法无需重复即可找到最长子串

时间:2018-11-08 19:43:35

标签: java algorithm

public int lengthOfLongestSubstring(String s) {
   //using a Collection to check if duplicate elements exist.
    int count = 0;
    int max = 0;
    ArrayList<String> str = new ArrayList();
    for(int i =0; i< s.length();i++){
        String temp = Character.toString(s.charAt(i));
        if(str.contains(temp)){
            int idx = str.indexOf(temp);
            for(int j = 0; j<= idx;j++)  // clear all the elements before the duplicate elements, inluding the
                str.remove(0);          //duplicate. So, no elements collision in the new list.
            str.add(temp);
            count = str.size();  // update the count - the size of the new list.
        }else {
            str.add(temp);
            count++;
            if(count>max)
                max=count;
        }


    }        
    return max;

} 

嗨,什么是时间和空间分析?我认为空间复杂度为O(n),但是时间复杂度取决于重复字符的数量,因为只有在遇到重复字符时才删除元素。 谢谢!

1 个答案:

答案 0 :(得分:0)

您所说的空间复杂度是O(n ^ 2)。

但是时间复杂度将为O(n ^ 2),因为您每次都在arraylist上进行线性搜索以查找char是否重复 if(str.contains(temp))在这一行。是O(k),其中k是arrayList的大小

考虑所有独特元素的示例

对于i = 1,您将进行1次手术

对于i = 2,您将进行2次操作

对于i = n,您将进行n次操作

总时间复杂度= O(1 + 2 + ... + n)= O(n ^ 2)