算法题

euroman 2008-03-08 10:36:27
写一个方法:
public String delString(String A,String B){
.....方法体......
}
用高效的方式从A中剔除包含B的字符,例如String A="hi are you ok";
String B="io";delString方法返回"h are yu k"
注意:不能使用String的instand of ,splid,char at等等库函数
请问怎么做?

我做了,有没什么意见?

private String delString( char [] a, char [] b ) {
int max = Integer.MIN_VALUE;
for( char ch : b ) {
if( max < (int)ch ) {
max = (int)ch;
}
}

for( char ch : a ) {
if( max < (int)ch ) {
max = (int)ch;
}
}

int [] arrayA = new int [max + 1];
int [] arrayB = new int [max + 1];
for( char ch : a ) {
arrayA[(int)ch]++;
}
for( char ch : b) {
arrayB[(int)ch]++;
}
for( int i = 0; i < max; i++ ) {
if( arrayA[i] != 0 && arrayB[i] != 0 ) {
arrayA[i] = 0;
}
}
String s = "";
for( int i = 0; i < a.length; i++ ) {
if( arrayA[(int)a[i]] != 0 ) s += a[i];
}
return s;
}

public void testXixi() {
String A="hi are you ok";
String B="io";
System.out.println( this.delString(A.toCharArray(), B.toCharArray()) );
}

算法分析:
这个算法相当浪费空间,但是可以让时间复杂度降到线型
应为如果用迭代得方法,那么时间复杂度是A.length * B.length
但是用这个方法,
我们建立两个int数组,里面储存字母显示字符串A和字符串B的字符的显示的次数
由于两个数组的长度一样,而且对应的index和字符一样,那么只要对比index就可以得出A数组里面有那些字符B里面有,然后把对应的元素的显示次数清零
最后通过数组,把不为零的数组算出来就可以了

计算两个数组的长度,算出最大值的时间复杂度是A.length + B.length
计算两个数组里面字符出现的次数的时间复杂度和上面一样
最后清零的时间复杂度是数组的长度(数组最大长度不超过255 because char)
那么最后得出结果的复杂度也 <= A.length
最后我们可以算出 O(n)
这个算法最大的毛病是耗费内存,按时节省了很多的时间.
...全文
121 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
euroman 2008-03-09
  • 打赏
  • 举报
回复
您算法的时间复杂度是O(n^2)

如果两个字符串相当长,而且里面符号没有重复,那么效果也没有显著提高
您在某些程度上降低了平均复杂度,但是总体上在最坏情况上没有作出优化.

简单说,您的算法的复杂度随着数据量增大呈非线性增长
老紫竹 2008-03-08
  • 打赏
  • 举报
回复
请参考我的一个实现。
除了toCharArray(), 其它的方法没用
http://www.java2000.net/viewthread.jsp?tid=1764
ninesea 2008-03-08
  • 打赏
  • 举报
回复
不是说这是迅雷的面试题吗
老紫竹 2008-03-08
  • 打赏
  • 举报
回复
难道还是那个传说中的面试题?
handsomelove 2008-03-08
  • 打赏
  • 举报
回复
确实啊。。。
malligator 2008-03-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java2000_net 的回复:]
难道还是那个传说中的面试题?
[/Quote]

62,612

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧