2个字符串a,b, 要求去除b中所有包含在a内的字符, 最快算法, 不限空间.

解决方案 »

  1.   

    StringBuilder winner = new StringBuilder();
    赋值
    winner.Replace("a","");速度比string的快22倍
      

  2.   

    // 睡不着 无聊写段代码测着玩
    // 
    // 本来以为转化为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();
    }因为自己的电脑属于上个世纪的产品 性能太差 没有做更长字符串的测试
    加上刚学没多久 水平跟电脑性能一样差 不敢保证测试的正确性
      

  3.   

    楼上,你测试的数据太小了。StringBuilder 比string快22倍是大概数,随处理量大而变得更大,如果很小,那么基本没有区别。
      

  4.   

    用HashTable对a,b中较长的字符串建索引,再在另一个字符串中用此表进行顺序查询,O(Min(a.length, b.length))
      

  5.   

    将字符串a排序,使用堆排序(空间换时间)
    遍历字符串b,对a进行二分查找,如果找到删除相应字母,并用一个int[26]的数组保存删除字母,比如'a'删除了,就将int数组第0位置1,删除'b'就将第一位置1.遍历下一个字母先查看数组,为0的话再对a进行二分查找,为1的话说明以前删除过,继续下一个。