确定给定代码的时间和空间复杂性

时间:2014-08-30 05:19:20

标签: java algorithm time-complexity space-complexity

我希望为此问题编写代码:

  

给定一个字符串,在O(n)时间和O(1)空间中删除它的重复项。

现在,我编写了一个代码来删除字符串中的重复项。

public class RemoveDuplicates
{
    public static void main(String args[])
    {
        String input = "aabbccc";
        char[] inputArray = input.toCharArray();
        for(int i=0;i<inputArray.length;i++)
        {
            for(int j=i+1;j<inputArray.length;j++)
            {
                if(inputArray[i] == inputArray[j])
                    inputArray[j] = ' ';
            }
        }
        input = new String(inputArray);
        input = input.replaceAll("\\s+","");
        System.out.println("The String after removing duplicates is : "+input);
    }
}

实际上,我正在拍摄一个角色并与其他人进行比较,如果发现它们相等,则用空格替换找到的角色。最后,删除字符串中的所有空格。

由于使用了两个for循环,我基本了解它必须是 O(n ^ 2)实现(关于时间)。如何修改我的代码 O(n)时间和 O(1)空间复杂度?

或者换句话说 O(1)空间要求是什么意思?我应该在时间要求中使用单个for循环而不是两个吗?

2 个答案:

答案 0 :(得分:5)

O(n)表示没有嵌套for循环,O(1)表示输入所需的常量存储。

如果您的输入字符串被限制为全部ASCII,则此问题非常简单。

`
    boolean[] counter = new boolean[256];
    StringBuilder sb = new StringBuilder(input);
    for (int i = 0; i < sb.length(); i++) {
        if (counter[(int) input.charAt(i)]) {
            sb.setCharAt(i, ' ');
        }
        counter[(int) input.charAt(i)] = true;
    }
`

但是如果输入不是ASCII而是Unicode,则无法在O(1)空间中解决。

答案 1 :(得分:0)

如果字符串始终排序,则可以使用O(n)和O(1)空格来完成。

    public String removeDuplicates(String input){

    if(input.length() <= 1){
        return input;
    }
    char[] inputArray = input.toCharArray();

    int count = 0;

    for(int i = 1; i < input.length(); ++i){

        if(inputArray[i] != inputArray[count]) {
            inputArray[++count] = inputArray[i];
        }
    }


    return String.valueOf(inputArray, 0, count + 1);
}

但如果它没有排序,你必须对它进行排序。需要O(n lg(n))

或使用哈希,但它不适用于O(1)空间。

最后你可以看看here

相关问题