一、什么是前后缀
字符串的前缀:符号串左部的任意子串(或者说是字符串的任意首部)
字符串的后缀:符号串右部的任意子串(或者说是字符串的任意尾部)
举例:比如 101110 它的前缀就是空串、1、10、101、1011、10111、101110 ;后缀就是空串、0、01、011、0111、01110、011101
二、设计窗口界面
进入vs,选择C#窗口应用,创建一个新的项目,然后就是设计一个窗口界面
1、字符串输入
想要获取输入的字符串,这里选择TextBox这个控件,直接在工具箱中选择这个控件,拖入到窗口中,然后放到你想要放的位置
2、执行按钮
执行按钮就是运行函数的按钮,通过这些函数来获取通过TextBox输入的字符串的前后缀以及子串,这里的控件就选择Button
3、结果输出
输出窗口就是输出经过运行函数后得到的结果,这里控件选用ListBox
4、退出窗口
退出按钮就是直接结束整个文件的运行,同样选用Button
这是最终设计结果的样图(可以按照自己的喜好来进行排版)
三、函数实现
在这里我们从难到易开始讲解,先是退出按钮的定义,然后是执行按钮的定义。
1、退出
在退出按钮上双击,进行这个按钮的定义,在这个按钮的函数中输入以下内容,就达到了我们的目的了
1 this.Close();
2、执行
在执行按钮中包含了许多的函数,用来对字符串进行前缀、后缀、子串的筛选,在这个版块中,首先讲解一下,我们自己定义的前后缀函数的含义
//前缀函数 private string[] prefix(string str) { int len = str.Length; //获取字符串的长度 string s = ""; //用于存放每一个元素 string[] result = new string[len]; //定义新的数组 for(int i=0;i<len;i++) { s = s + str[i]; //每次往后加一个字符 result[i] = s; //把结果存放到新的数组中 } return result; }
//后缀函数 private string[] suffix(string str) { int len = str.Length; //获取字符串长度 string s = ""; //用于存放每一个元素 string[] result = new string[len];//定义新的数组 for (int i = len - 1; i >= 0; i--) { s = str[i] + s; //每次从后往前加一个字符 result[len - 1 - i] = s; //把结果存放到新的数组 } return result; }
因为我已经在代码注释中详细解释了每一行的含义,这里就不再进行过多的赘述,所以接下来我们就直接讲述,对这两个函数的调用,以及输出结果
接下来所有的代码都是定义在执行按钮里的,也就是你要双击执行按钮,进入代码界面,找到执行的函数,然后在里面输入以下的代码
首先,是对于输入空字符串的警告(也就是你啥也没输入,就点击了执行,总要提醒让你输入)
if (text_input.Text == "") { MessageBox.Show("尚未输入字符!请重新输入。"); //显示警告提示窗 }
上面出现了if,那下面就少不了else,但是这个else里的内容比较多;
首先出现在else里的是对TextBox中内容的获取,在C++中就相当于cin
string str = text_input.Text;//获取用户输入的串 int len = text_input.Text.Length; //获取这串字符串的长度 string output_str = "串X = " + str;
result.Items.Add(output_str);//把文本值附加到listbox中
既然我们已经获取到了想要处理的字符串,那接下来就是把这串字符串送到我们之前定义的前后缀函数中进行处理,也就是输出,我们想要的前后缀字符串
//输出前缀及个数 string[] result_pre = prefix(str); //定义新的数组,存放前缀函数处理的内容 string output_pre = "X的前缀 = { "; //定义输出的格式 for(int i=0;i<len;i++) //循环输出上述新数组中的内容 { output_pre = output_pre + result_pre[i] + ", "; } output_pre = output_pre + "空串 } 个数 = " + (len + 1); //这里对len加1 是因为还有一个空串
result.Items.Add(output_pre); //把结果添加到ListBox中,显示出来
//输出后缀及个数 string[] result_suf = suffix(str); //定义新的数组,存放前缀函数处理的内容 string output_suf = "X的后缀 = { "; //定义输出的格式 for (int i = 0; i < len; i++) //循环输出上述新数组中的内容 { output_suf = output_suf + result_suf[i] + ", "; } output_suf = output_suf + "空串 } 个数 = " + (len + 1); //这里对len加1 是因为还有一个空串 result.Items.Add(output_suf); //把结果添加到ListBox中,显示出来
在上述输出前后缀代码中,对每一行代码都进行了详细的注释,这里也就不再进行过多的赘述,自行参悟
在输出了前缀、后缀之后,我们就需要输出最后的内容——子串
//输出子串及其个数 int max_res_index = ((1 + len) * len) / 2; //计算得出字串的最长长度 string[] result_son = new string[max_res_index]; //定义一个新的数组,长度为计算的长度 int res_index = 0; for (int i = 0; i < len; i++) { string[] temp = prefix(str); //去掉一个字符之后的串的前缀 for (int j = 0; j < len - i; j++) { result_son[res_index] = temp[j]; res_index++; } str = str.Remove(0, 1);//删除开头的字符 }
经过上面的运算后,会发现会出现重复的子串,这里就要进行去重处理
//去重 for (int i = 0; i < max_res_index; i++) { for (int j = i + 1; j < max_res_index; j++) { if (result_son[i] == result_son[j]) { for (int k = j + 1; k < max_res_index; k++) { result_son[k - 1] = result_son[k]; } max_res_index--; j--; } } }
在完成所有的操作后,就要把得到的子串通过ListBox输出
string output_son = "X除前后缀之外的子串 = { "; for (int i = 0; i < max_res_index - 1; i++) { output_son = output_son + result_son[i] + ", "; } output_son = output_son + result_son[max_res_index - 1] + " 空串 } 个数 = " + (max_res_index+1); result.Items.Add(output_son);
因为和上面的代码类似,这里也就不解释了
到这里我们的执行按钮的所有代码就结束了这么多的内容都是在else里的,千万不要搞错了
以上所有内容就是本次实验的所有内容了。
最后给出我们做出来的最终结果
图片我也不知道怎么回事,全是椭圆形,就凑活着看吧!!!