让我们一个字符串“abbashbhqa”。我们必须以输出应为“abshq”的方式删除重复的字符。一种可能的解决方案是检查每个字符与字符串中存在的其他字符然后进行操作。但这需要O(n ^ 2)时间复杂度。有没有优化的方法呢?
答案 0 :(得分:3)
O(N):
定义一个布尔数L [26]。将all设置为FALSE。 构造一个新的空字符串
遍历字符串并为每个字母检查L [x]是否为FALSE。如果是这样,将x附加到新字符串并将L [x]设置为1。
将新字符串复制到旧字符串。
答案 1 :(得分:1)
一旦迭代字符串,就会创建一个集合(或哈希集)。如果字母表是有限的(例如英文字母),你可以创建一个256布尔数组并使用ASCII代码作为它的关键。让所有布尔在起点都是假的。每次迭代都会检查array []是false还是true。如果它是假的,那么符号不是重复的,所以你将它标记为array [] = true,不要从字符串中删除然后再继续。万一它是真的 - 符号是重复的
答案 2 :(得分:0)
可能这将是上述问题的实施
import java.util.*;
import java.io.*;
public class String_Duplicate_Removal
{
public static String duplicate_removal(String s)
{
if(s.length()<2)
return s;
else if(s.length()==2)
{
if(s.charAt(0)==s.charAt(1))
s = Character.toString(s.charAt(0));
return s;
}
boolean [] arr = new boolean[26];
for(int i=0;i<s.length();i++)
{
if(arr[s.charAt(i)-'a']==false)
arr[s.charAt(i)-'a']=true;
else
{
s= ((new StringBuilder(s)).deleteCharAt(i)).toString();
i--;
}
}
return s;
}
public static void main(String [] args)
{
String s = "abbashbhqa";
System.out.println(duplicate_removal(s));
}
}
答案 3 :(得分:0)
我使用Python解决它在O(n)时间和O(n)空间中工作 - 我使用set()作为set不允许重复--- 在这种情况下,元素的顺序会发生变化 - 如果您希望订单保持相同,那么您可以使用OrderedDict(),它也可以在O(n)时间内工作 -
def remove_duplicates(s , ans_set):
for i in s: # O(n)
ans_set.add(i) # O(1)
ans = ''
for char in ans_set:
ans += char
print ans
s = raw_input()
ans_set = set()
remove_duplicates(s , ans_set)
from collections import OrderedDict
def remove_duplicates_maintain_order(a):
ans_dict = OrderedDict()
for i in a: # O(n)
ans_dict[i] = ans_dict.get(i , 0) + 1 # O(1)
ans = ''
for char in ans_dict:
ans += char
print ans
s = raw_input()
remove_duplicates_maintain_order(s)