假如有字符串“6sab3kdjfkaafbd”,用最有效快速的方法去掉字符“ab3”,不能用(indexOf,substring,replace等)现成的类的方法,必须自己手工实现。 
以下是我的想法..请高手指正.大家也贴一下自己的代码..讨论一下怎么才能更好...  public string myReplace(string str1, string str2)
        {
            char[] cArray1 = str1.ToCharArray();
            char[] cArray2 = str2.ToCharArray();
            string s = null;
            bool tag = false;
            for (int i = 0; i < cArray1.Length; i++)
            {
                for (int j = 0; j < cArray2.Length; j++)
                {
                    if (((i+j)<cArray1.Length) && cArray2[j] == cArray1[i + j])
                    {
                        tag = true;
                    }
                    else
                    {
                        tag = false;
                        break;
                    } 
                }
                if (tag == true)
                {
                    i = i + (cArray2.Length - 1);
                    continue;
                }
                else
                {
                    s += cArray1[i].ToString();
                }
                
            }
            return s;
        }

解决方案 »

  1.   

    兄弟,我想按出题人的意思,ToCharArray和Length也不能用啊。
      

  2.   

    把“6sab3kdjfkaafbd”, 放到char[] 里面 再一个一个的找带a的不就可以了 汗 O(n) 问题
      

  3.   

    不知道出题人对C#语法的限制如何,如果仅仅限制了String函数,那么GetEnumerator函数应该是可以用的,因为那个是通用函数,显然使用枚举遍历只要一遍即可完成,效率最高,不信的话你可以自己测试下效果:        public string myRemove(string str1, string str2)
            {
                var enu1 = str1.GetEnumerator();
                var enu2 = str2.GetEnumerator();
                if (enu2.MoveNext())
                {
                    StringBuilder sb = new StringBuilder();
                    while (enu1.MoveNext())
                    {
                        if (enu1.Current != enu2.Current)
                        {
                            sb.Append(enu1.Current);
                        }
                        else if(!enu2.MoveNext())
                        {
                            enu2.Reset();
                            enu2.MoveNext();
                        }
                    }
                    return sb.ToString();
                }
                else
                {
                    return str1;
                }
            }
      

  4.   

    谢谢大家对此贴的关注..尤其谢谢青龙白虎贴出的代码,让我学习到了新的知识...但这段代码还是不能满足题目要求...上面的代码只考虑到了 str1中字符跟str2中第一个匹配..但没有考虑到.str1中的字符跟第二个字符不匹配的情况.这样得出的结果..在str1里面,只要是跟str2中第一个字符相同的字符.都没有输出出来..
      

  5.   

    读书的时候学过,没有这些方法前,我们都用“模式匹配”来查找数据。
    如果回到turbo c,那就自己写个“模式匹配”哦!
      

  6.   

    String str = "6sab3kdjfkaafbd";
    StringBuffer stb = new StringBuffer();
    char[] c = str.toCharArray();
    for (int i = 0; i < c.length; i++) {
    if (c[i] == 'a' || c[i] == 'b' || c[i] == '3') {
    } else {
    stb.append(c[i]);
    }
    }
    System.out.println(stb.toString());
      

  7.   

    用delphi写一个dll,using之。没用到C#中的相关类哦,呵
      

  8.   

    SqlHelper.GetTable("select REPLACE(..) ").Rows[0][0].ToString();
    哈,别给我零分哦。
      

  9.   

    题目的意思是编写一IndexOf方法吧
      

  10.   


    static class Program {
    /// <summary>
    /// 查找值在字符串中的位置
    /// </summary>
    /// <param name="str">要查找的字符串</param>
    /// <param name="value">要查找的值</param>
    /// <param name="startIndex">开始位置</param>
    /// <param name="endIndex">结束位置</param>
    /// <returns>返回找到的位置。若未找到,则返回-1</returns>
    public unsafe static int IndexOf(char* str, char* value, int startIndex, int endIndex) {
    for (int i = startIndex;( i < endIndex && str[i] != '\0') || endIndex == -1; i++) {
    int p = 0;
    for (; value[p] != '\0'; p++) {
    if (str[i] == '\0') return -1;
    if (str[i] != value[p]) {
    goto CONTINUE;
    }
    i++;
    }
    return i - p;
    CONTINUE:
    ;
    }
    return -1;
    }
    /// <summary>
    /// 返回字符串首字符的指针
    /// </summary>
    /// <param name="str">字符串</param>
    unsafe static char* CharPtr(string str) {
    fixed (char* p = str) {
    return p;
    }
    }
    unsafe static void Main() {
    int index = IndexOf(CharPtr("6sab3kdjfkaafbd"), CharPtr("aaf"), 0, -1);
    }
    }
      

  11.   

    使用KMP算法找到匹配字符串“ab3”,再将其删除或将其余字符复制到新string
      

  12.   

            static void Main(string[] args)
            {
                Console.WriteLine(Trim("6sab3kaab3djfkaafbd", "ab3"));
                Console.ReadKey();
            }        private static string Trim(string s, string pattern)
            {
                int startPosition = 0;
                int newPosition;
                StringBuilder sb =new StringBuilder();
                while(true)
                {
                    startPosition = Location(s, startPosition, pattern[0]);
                    if (startPosition != -1)
                    {
                        if (Match(s, startPosition, pattern))
                        {
                            s=s.Remove(startPosition, pattern.Length);
                        }
                        else startPosition++;
                    }else return s;
                }
            }        /// <summary>
            /// 获取下一个pattern的启示字母的位置
            /// </summary>
            /// <param name="s">母串</param>
            /// <param name="startPosition">开始查找的位置</param>
            /// <param name="c">pattern的首字母</param>
            /// <returns>
            /// 匹配位置。为匹配到则返回-1; 
            /// </returns>
            private static int Location(string s, int startPosition, char c)
            {
                for (int i = startPosition; i < s.Length; i++)
                {
                    if (s[i]==c) return i;
                }
                return -1;
            }        /// <summary>
            /// 判断是否匹配pattern
            /// </summary>
            /// <param name="s">母串</param>
            /// <param name="startPosition">母串中开始匹配的位置</param>
            /// <param name="pattern">要匹配的pattern</param>
            /// <returns>匹配返回true;否则 false</returns>
            private static bool Match(string s, int startPosition, string pattern)
            {
                //首字母不需再次判断,故从1开始
                for (int i = 1; i < pattern.Length; i++)
                {
                    if (s[startPosition+i]!=pattern[i]) return false;
                }
                return true;
            }
      

  13.   

    如果说最有效快速的话,可以看看Sunday算法!
      

  14.   

            private void Form1_Load(object sender,EventArgs e) 
            {
                MessageBox.Show(EggPain("6sab3kdjfkaafbd", "ab3") + "\r\n" + "6sab3kdjfkaafbd".Replace("ab3", ""));
            }        private string EggPain(string M, string S)
            {
                StringBuilder sOut = new StringBuilder();
                int i = 0,j=0;
                bool IsCompare = false;
                while(i<M.Length)
                {
                    for (j = 0; j < S.Length; j++)
                    {
                        if (M[i+j].CompareTo(S[j])!=0) 
                        {
                            sOut.Append(M, i, 1);
                            IsCompare = false;
                            break;
                        }
                        IsCompare = true;
                    }
                    i+=IsCompare?j:1;
                }
                return sOut.ToString();
            }
      

  15.   


                string str = "6sab3kdjfkaafbd";
                Console.WriteLine(str.Remove(2, 3));
                Console.ReadKey()