在字符串中查找重复项 - 顺序复杂性

时间:2013-06-04 02:08:26

标签: java

有人可以验证此代码的订单复杂性是否为n(logn)?如果不是,你能解释一下你的答案吗?我非常感谢帮助

  public static boolean isDuplicate(String s){
        char[] sArray = s.toCharArray();
        for(int i=0;i<sArray.length/2;i++){
            for(int j=sArray.length/2+1;j<sArray.length;j++){
                if(sArray[i] == sArray[j])
                    return true;
            }
        }
        return false;
    }

1 个答案:

答案 0 :(得分:1)

不,它不是,它是O(n ^ 2),因为你在外部循环中迭代整个数组,并且对于i的每个值,你也在迭代整个数组内循环。将数组拆分为2的事实不会改变顺序复杂性。

如果要查找带有O(n * log(n))算法的重复项,可以对数组进行排序,并检查相邻位置的重复项,如下所示:

public static boolean isDuplicate(String s){
    char[] sArray = s.toCharArray();
    Arrays.sort(sArray); // O(n*log(n))
    for (int i=0; i<sArray.length-1; i++) // O(n)
        if (sArray[i]==sArray[i+1])
            return true;
    return false;
}

更好的是,您可以使用HashSet,并在O(n)中找到重复项:

public static boolean isDuplicate(String s){
    HashSet<Character> alreadySeenChars = new HashSet<Character>();
    char[] sArray = s.toCharArray();
    for (int i=0; i<sArray.length; i++) { // O(n)
        if (alreadySeenChars.contains(sArray[i])) // O(1)
            return true;
        alreadySeenChars.add(sArray[i]); // O(1)
    }
    return false;
}