题目
获取两个字符串中最大相同字串,比如:
- str1 = “abcwerthelloyuiodef”,
- str2 = “cvhellobnm”
- 提示:
- 将短的那个串,进行长度依次递减的字串与较长的字串进行比较
题解
这里先分析 两个字符串只有一个最大相同子串的情况:
(1)思路分析:
只有一个最大相同最子串的情况下:
---->跟找最大公约数的算法类似:先确定str1、str2哪个更短一下, 拿短的去比较深蓝色文字
比较的具体情况为:假设有:
- str1 = “abcwerthelloyuiodef”,
- str2 = “cvhellobnm”(length==10)
----利用string的contains(CharSequence s),判断maxstr中,是否包含每次的minstr(str2自己或者子串,具体的minstr是什么进行比对,取决于是哪一趟比较):
- (1)整体的话,因为str2长度为10,则有10大轮的比较(每一轮结束minstr-1,即minstr的长度减少1)
- (2)每一大轮中,具体的-1的情况也不太一样:
- minstr的初值为str2:cvhellobnm
- ①如果第一轮结束之后,contains()的返回值为false,将minstr的长度-1。
- 完成length-1操作之后,对于下一次要进行contains()的minstr有2种情况:
- cvhellobn 或者 vhellobnm
- ②如果第二轮结束之后,contains()的返回值为false,将minstr的长度-1。
- 在①的基础上,完成length-1操作之后,对于下一次要进行contains()的minstr有4种情况:
- cvhellob、vhellobn 或者 vhellobn、hellobnm
- 也即,每次进行length-1 的操作,有两种可能:
- 从当前minstr的首部-1,或者从当前minstr的尾部-1
- –>设置两个指针,来完成这个功能:
- start、end
(2)实现主要功能的代码块:
/*
* 将短的那个串,进行长度依次递减的字串与较长的字串进行比较 外层循环控制的是:一共可以length-1进行多少次(第一次不进行-1,直接比较)
*/
for (int i = 0; i < minString.length(); i++) {
/*
* 因为 substring()的截取区间是左开右