题目解析
本题我的思路是利用双指针。
定义两个指针变量L,R,其中L指向数字串的开头,R用于扫描。
首先,我们需要确定第一个数字串的开头位置,逻辑很简单,遍历输入字符串S的每一个字符c:
- 如果c是数字,则c字符所在位置可以作为第一个数字串的开头位置,否则继续查找下一个c
- 如果c是加减号,则还需要进一步检查这个加减号的后面是不是跟着数字,如果跟着数字,则可以作为第一个数字串的开头,否则继续查找下一个c
找到第一个数字串的开头后,即知道L位置后,我们可以初始化R = L+1,即R从L+1位置开始扫描,假设扫描到的字符是c,则存在以下情况:
- c是数字,则不会中断数字串,可以继续R++扫描
- c是点,则需要先判断,这个点是否是合法的数字串点(即点位置R前后都是数字):
- 如果点位置前后不都是数字,则说明,点位置 R 前面的内容无法复用到下一个数字串中,此时我们需要先将[L, R-1]范围的合法数字串记录下来,然后按照前面遍历S来找数字串开头位置的逻辑,来找下一个数字串开头位置
- 如果点位置前后都是数字,则此时我们进一步判断,当前数字串,即[L, R-1]部分是否还有其他点,如果有,则一个数字串中不能包含两个点,此时我们需要先记录[L, R-1]范围内的合法数字串,假设第一个点位置是dotIdx,则下一个数字开头位置L = dotIdx + 1,这样才能保证下一个数字串最长,然后更新dotIdx = R,最后继续R++扫描
- c是加减号,此时会中断数字串,