求去除字符串内字符最快算法

simonw 2006-10-15 01:41:36
2个字符串a,b, 要求去除b中所有包含在a内的字符, 最快算法, 不限空间.
...全文
152 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
shrinerain 2006-10-16
  • 打赏
  • 举报
回复
将字符串a排序,使用堆排序(空间换时间)
遍历字符串b,对a进行二分查找,如果找到删除相应字母,并用一个int[26]的数组保存删除字母,比如'a'删除了,就将int数组第0位置1,删除'b'就将第一位置1.遍历下一个字母先查看数组,为0的话再对a进行二分查找,为1的话说明以前删除过,继续下一个。
Nara 2006-10-16
  • 打赏
  • 举报
回复
用HashTable对a,b中较长的字符串建索引,再在另一个字符串中用此表进行顺序查询,O(Min(a.length, b.length))
simonw 2006-10-15
  • 打赏
  • 举报
回复
楼上各位误解我的意思了吧, 这是算法题, 不是语言题.
青官司 2006-10-15
  • 打赏
  • 举报
回复
哦 可能
winner2050 2006-10-15
  • 打赏
  • 举报
回复
楼上,你测试的数据太小了。

StringBuilder 比string快22倍是大概数,随处理量大而变得更大,如果很小,那么基本没有区别。
青官司 2006-10-15
  • 打赏
  • 举报
回复
// 睡不着 无聊写段代码测着玩
//
// 本来以为转化为char再替换会是最快的方法 结果大失所料
private void button1_Click(object sender, System.EventArgs e) {
string str1 = "abcdefghijklmnopqrstuvwxyz";
string str2 = "ab";
StringBuilder str3 = new StringBuilder();
bool isExist;

for (int i = 0; i < 15; i++) { str1 += str1; }

char[] ch1 = str1.ToCharArray();
char[] ch2 = str2.ToCharArray();

DateTime dt1 = DateTime.Now;
// start
foreach (char c1 in ch1) {
isExist = false;

foreach (char c2 in ch2) {
if (c2 == c1) {
isExist = true;
break;
}
}

if (!isExist)
str3.Append(c1);
}
// end
this.button1.Text = (DateTime.Now.Ticks - dt1.Ticks).ToString();
}

private void button2_Click(object sender, System.EventArgs e) {
string str1 = "abcdefghijklmnopqrstuvwxyz";
string str2 = "ab";
string str3 = string.Empty;

for (int i = 0; i < 15; i++) { str1 += str1; }

DateTime dt1 = DateTime.Now;
// start
str3 = str1.Replace(str2, string.Empty);
// end
this.button2.Text = (DateTime.Now.Ticks - dt1.Ticks).ToString();
}
// 本来相信楼上的结果 因为一直以为用StringBuilder会比频繁更改string得到更好的性能
// 顺便试了一下 但我测不出22倍的差距
private void button3_Click(object sender, System.EventArgs e) {
string str1 = "abcdefghijklmnopqrstuvwxyz";
string str2 = "ab";
string str3 = string.Empty;
StringBuilder sb = new StringBuilder();

for (int i = 0; i < 15; i++) { str1 += str1; }

sb.Append(str1);

DateTime dt1 = DateTime.Now;
// start
sb.Replace(str2, string.Empty);
// end
this.button3.Text = (DateTime.Now.Ticks - dt1.Ticks).ToString();
}

因为自己的电脑属于上个世纪的产品 性能太差 没有做更长字符串的测试
加上刚学没多久 水平跟电脑性能一样差 不敢保证测试的正确性
winner2050 2006-10-15
  • 打赏
  • 举报
回复
StringBuilder winner = new StringBuilder();
赋值
winner.Replace("a","");

速度比string的快22倍
simonw 2006-10-15
  • 打赏
  • 举报
回复
顺便写上时间复杂度

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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