以前做一到面试题是写一个方法,该方法类似与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[]中的索引
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;
}
{
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)
{
{
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;
}
}
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
{
}
}
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();
{
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)
{
//算法思想是这样的,把两个字符串转换为字符数组,然后进行遍历,记录下数组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;
}
}
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;
}
}
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;
}