Java 元素去除算法的改进 问题
给定字符串Java 元素去除算法的改进 问题,java,algorithm,Java,Algorithm,给定字符串s和m查询。对于每个查询,删除字符x的第次出现的K 例如: abcdbcaab 5 2 a 1 c 1 d 3 b 2 a Ans abbc 我的方法 我正在使用位树进行更新操作 代码: 有一些关键操作未显示,其中一个(很可能是更新方法)的成本与您想象的不同。此外,您所述的复杂性肯定是错误的,因为在某些情况下,您必须扫描最小值为O(N)的字符串 但无论如何,这里显然正确的策略是遍历查询,按字符分隔,然后按相反顺序遍历查询,找出要抑制的字符的初始位置。然后在字符串中运行一次,仅在合适
s
和m
查询。对于每个查询,删除字符x
的第次出现的K
例如:
abcdbcaab
5
2 a
1 c
1 d
3 b
2 a
Ans abbc
我的方法
我正在使用位树进行更新操作
代码:
有一些关键操作未显示,其中一个(很可能是
更新
方法)的成本与您想象的不同。此外,您所述的复杂性肯定是错误的,因为在某些情况下,您必须扫描最小值为O(N)
的字符串
但无论如何,这里显然正确的策略是遍历查询,按字符分隔,然后按相反顺序遍历查询,找出要抑制的字符的初始位置。然后在字符串中运行一次,仅在合适时才发出字符。如果实现得好,这个解决方案应该可以在O(N+mlog(M))
中实现
挑战在于如何有效地表示删除。我在考虑某种相对偏移量的树,这样,如果你发现第一次删除是
3a
,你可以有效地将它插入到树中,并在以后每次删除之后移动它。这是log(M)
位的位置。请显示value
方法的代码好吗?最好知道N
和M
可以有多大,时间限制到底有多大。什么是位树?特别是,如何将int[][]
解释为树?以及中的是什么?如果它是java.util.Scanner
的实例,则速度可能太慢。无缓冲输出也可能是性能不佳的原因。复杂性不是MLON,它是M(log(n)^ 2)为什么它是偏离主题的问题。算法与计算机科学无关,只考虑语法问题。
for (int i = 0; i < ss.length(); i++) {
char cc = ss.charAt(i);
freq[cc-97] += 1;
if (max < freq[cc-97]) max = freq[cc-97];
dp[cc-97][freq[cc-97]] = i; // Counting the Frequency
}
BIT = new int[27][ss.length()+1];
int[] ans = new int[ss.length()];
int q = in.nextInt();
for (int i = 0; i < q; i++) {
int rmv = in.nextInt();
char c = in.next().charAt(0);
int rr = rmv + value(rmv, BIT[c-97]); // Calculating the original Index Value
ans[dp[c-97][rr]] = Integer.MAX_VALUE;
update(rmv, 1, BIT[c-97], max); // Updating it
}
for (int i = 0; i < ss.length(); i++) {
if (ans[i] != Integer.MAX_VALUE) System.out.print(ss.charAt(i));
}
public static void update(int i , int value , int[] arr , int xx){
while(i <= xx){
arr[i ]+= value;
i += (i&-i);
}
}
public static int value(int i , int[] arr){
int ans = 0;
while(i > 0){
ans += arr[i];
i -= (i &- i);
}
return ans ;
}