实现indexof()方法

以前做一到面试题是写一个方法,该方法类似与string类的IndexOf()方法,就是返回一个字符串在另 一个字符串中的索引。
例如 string1=“abcd”,string2=“cd”  那么string1.IndexOf(string2)就返2。
    我当时是这么想的 要找它在另一字符串的位置 首先要判断第一个字符串是否包含它。然后在说具体位置。
今天桂老师出了一道类似的题 ,就是判断一个字符串是否包含另一个。 我写了老半天,这里给大家分享下我的算法。方法很笨欢迎拍砖指点。
思想是这样:
            把字符串转化为字符数组,记录下字符数组1与字符数组2相同字符的索引,如果索引是连续的整数,就说明是包含,否则不包含。
    有 s1=“acbcd”,s2=“cd”
首先把s1和s2分别转化为字符数组 arr1[]和arr2[]
            char temp = arr2[0];//获取被比较的字符串的第一个字符
            for (int i = 0; i <arr1.Length; i++)
            {
                if (temp == arr1[i])
                {
                    aa = aa + i.ToString();//找一找所有arr2[0]在arr1[]中的索引
                     //这个例子中aa==13代表索引为1和索引为3
                    //就是说只有从1和3的位置找才有可能找到要匹配的值
                }
            }
然后要获得s2(被比较者)的所有字符在s1(比较着)索引位置(用字符串收集了)
static string getstring(char[] arr1,char[]arr2,int count)
        {
            string temp = "";
            for (int q = 0; q < arr2.Length; q++)
            {
             
                //count 指定开始遍历的位置
               
                for (int k = count; k < arr1.Length; k++)
                {
                  
                    if (arr2[q] == arr1[k])
                    {
                        temp = temp + k.ToString();
                        count++;
                        break;
                    }
                }
            }
            return temp;
        }
//在这个例子中返回的字符串是23就是一个c在s1的2索引处,d在s1的3索引处
然后我在去判断23是不是连续的整数
 static bool shuziPD(char[] chararr)//判断一个字符数组保存的是否是连续的数字字符
        {
            bool flog = true;
            for (int i = chararr.Length - 1; i > 0; i--)
            {
                if ((int)chararr[i] - (int)chararr[i - 1] == 1)
                {
                }
                else
                {
                    flog = false;
                    break;
                }
            }
            return flog;
        }
//对本例中的数据来说返回TRUE;
因为有arr2[0]就是字符c在s1中有多出
就要用循环来多次产生索引序列,然后判断是否连续,直到所有可能出现的c的位置都遍历一遍
 char []arr3 = aa.ToCharArray();//把上面方法得到的aa字符串转换为字符数组
           
            for (int i = 0; i < arr3.Length; i++)
            {
                string tempchar = arr3[i].ToString();
                int tempint = Int32.Parse(tempchar);
                ss = getstring(arr1, arr2, tempint);//分别在有被包含字符串第一个字符的索引处开始便利
             
   
                char[] chararr = ss.ToCharArray();//转化为字符数组
             
                if (shuziPD(chararr))//如果是连续的数字
                {
                    flog = true;//有一次为连续的数字说明字符串1就包含字符串2了
                    Console.WriteLine("被比较字符串在比较字符串中的索引位置" + arr3[i]);//打印出在比较字符串的索引位置
                    Console.WriteLine("_________________________");
                    break;//停止循环
                }
                else
                {
 
                }
            }
这样就实现了既判断是否包含有找到了所在的位置
完整的代码:
static void Main(string[] args)
        {
            Console.WriteLine("请输入第一个字符串");
            string s1 = Console.ReadLine();
            Console.WriteLine("请输入第二个字符串");
            string s2 = Console.ReadLine();
            if (contains(s1, s2))
            {
                Console.WriteLine("包含");
                Console.WriteLine("_________________________");
                Console.WriteLine(s1 + s2);
                Console.ReadLine();
            }
            else
            {
                Console.WriteLine("不包含");
                Console.WriteLine("_________________________");
                Console.WriteLine(s1);
                Console.WriteLine(s2);
             
            }
            Console.ReadLine();     
        }
        //算法思想是这样的,把两个字符串转换为字符数组,然后进行遍历,记录下数组2与数组1相同字符的索引
        //然后判断下索引的是否是连续的数字
      
        static bool  contains(string s1,string s2)
        {
            bool flog = false;
            char[] arr1= s1.ToCharArray();
            char[] arr2 = s2.ToCharArray();
           
            string ss = "";//用于判断是否是连续的数字
            string aa = "";//用于判断遍历的次数
           
            char temp = arr2[0];//获取被比较的字符串的第一个字符
            for (int i = 0; i <arr1.Length; i++)//记录下所有的比较字符串的包含被比较字符串的第一个字符的索引
            {
                if (temp == arr1[i])
                {
                    aa = aa + i.ToString();
                }
            }
         
            char []arr3 = aa.ToCharArray();
          
            for (int i = 0; i < arr3.Length; i++)
            {
                string tempchar = arr3[i].ToString();
                int tempint = Int32.Parse(tempchar);
                ss = getstring(arr1, arr2, tempint);//分别在有被包含字符串第一个字符的索引处开始便利
             
   
                char[] chararr = ss.ToCharArray();//转化为字符数组
             
                if (shuziPD(chararr))//如果是连续的数字
                {
                    flog = true;//有一次为连续的数字说明字符串1就包含字符串2了
                    Console.WriteLine("被比较字符串在比较字符串中的索引位置" + arr3[i]);//打印出在比较字符串的索引位置
                    Console.WriteLine("_________________________");
                    break;//停止循环
                }
                else
                {
 
                }
            }              
        
            return flog;
        }
        static bool shuziPD(char[] chararr)//判断一个字符数组保存的是否是联系的数字字符
        {
            bool flog = true;
            for (int i = chararr.Length - 1; i > 0; i--)
            {
                if ((int)chararr[i] - (int)chararr[i - 1] == 1)
                {
                }
                else
                {
                    flog = false;
                    break;
                }
            }
            return flog;
        }
        static string getstring(char[] arr1,char[]arr2,int count)//得到被比较的字符串的所有字符在比较的索引位置,用于判断是不是连续的数字
        {
            string temp = "";
            for (int q = 0; q < arr2.Length; q++)
            {
             
                //count 指定开始遍历的位置
               
                for (int k = count; k < arr1.Length; k++)
                {
                  
                    if (arr2[q] == arr1[k])
                    {
                        temp = temp + k.ToString();
                        count++;
                        break;
                    }
                }
            }
            return temp;
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值