关于最大公共字符串真的难为我这0基础的同学了,花了我整整5个小时,爬了好几个帖子,看不懂的居多,有用指针的,有用strstr这个没有学过的函数的。指针变量虽然说能看懂一部分,但是还是有点吃力,最后看到一个帖子说用二维数组来计数,就看了一下,只可惜他并没有用纯数组来做。所以我就根据学过的C语言,花了近3个小时,写出了下面的这些代码。- 请输入第一个字符串:
- nbitheimanb
- 请输入第二个字符串
- itheia
- ------------上方为输入数据-----------
- ----------下方为二维数组数据-----------
- 0 0 0 0 0 0
- 0 0 0 0 0 0
- 1 0 0 0 1 0
- 0 1 0 0 0 0
- 0 0 1 0 0 0
- 0 0 0 1 0 0
- 1 0 0 0 1 0
- 0 0 0 0 0 0
- 0 0 0 0 0 1
- 0 0 0 0 0 0
- 0 0 0 0 0 0
- ----------下方为结果数据-----------
- 最大公共字符串长度:5
- 最大公共字符串是:ithei
复制代码 上面是代码,下面是运行结果。
此理论是根据,二维数组,存放0,1,对于字符串中的某个字符,把它s1位置作为横坐标,把它s2的位置作为纵坐标,在二维数组里面赋值。如果相等,赋值为1,如果不相等,赋值为0。在例子中可以看到,二维数组输出的结果。然后用for循环遍历二维数组,找出值为1的元素,当找到这个元素时,接着判断该元素的右下角的元素是否为1,如果为1,则计数,直到不为1退出。这步的作用,就是判断公共字符串的个数,至于怎么来判断的,大家可以看数组,顺序必须得时由左上角到右下角的斜线上相同为1,不能是其它的方向。看数组可以看到2、3、4、5、6行(首行为0行)对应的0、1、2、3、4列,值为1。那么在数组s1中的2、3、4、5、6号元素,和s2的0、1、2、3、4号元素就是公共字符串。如此判断,找出最长的一个,用adds记录最后一位元素的横坐标或者是纵坐标,在这里我记录的是纵坐标也就是s2数组元素序号。输出的时候注意,记录的时最后一位元素序号,所以要减去该字符长度,才是公共字符串首元素的序号。然后循环输出。
PS:语文不是特别好,希望能大家能看的懂~~~
|