Problem
Description
Input
Output
Sample Input
样例1
xabcdafg
aafbcd
1
0 2
样例2
xabcdafg
aafbcd
2
0 2
2 5
Sample Output
样例1
4
样例2
6
Data Constraint
Solution
我最近新学了一个办法,叫双指针法。
Prepare
将字符串的每一个下标往后挪一位,0~n-1变成1~n。
读入的l,r需改为l+1,r+1,这样更加的好算。
别看K有10^5这么大,其实他有很多重叠的部分。
所以我们还要将那些没有被读入的区间覆盖到的下标补上。
接下来我们来合并区间。
先快排一遍,如果对于两个区间[a,b],[c,d](a<=d),如果c<=b,则可以将这两个区间合并成[a,d]。
顺便统计每个区间每个字母的个数。(这步很重要)
双指针法
假设s与t有交集,图片如下:
定义指针i,j与x,y,i,j表示在s与t的交集中相对于t串i,j所在的位置,x,y表示在s与t的交集中相对于s串x,y所在的位置。
首先j+1,将S[j]统计进一个数组里,这个数组表示当前s内的此区间的字母个数。如果此时此区间内的这个字母的个数大于原来s串此区间字母的个数则说明不合法,此时i要加1.如果i超过了有效位置,则说明s和t这样交集得到的最长公共子串的长度为0。如果i没有超过有效位置则要统计一下答案。
顺便说一句,如果i,j变化,那么x要随i+1而+1,那么y要随j+1而+1。
至于为什么要想到双指针法
看到字符串,且这道题问的是2个字符串的最长公共子串的长度,那么我们很容易想到队列。然后可以拓展到双指针。
——2016.5.18