我希望为此问题编写代码:
给定一个字符串,在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循环而不是两个吗?
答案 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