1 class Solution: 2 def numberOfSubstrings(self, s: str) -> int: 3 n = len(s) 4 prelist = [] 5 for i in range(n): 6 a_index = s.find('a',i) 7 b_index = s.find('b',i) 8 c_index = s.find('c',i) 9 prelist.append([a_index,b_index,c_index]) 10 count = 0 11 for i in range(n): 12 curlist = prelist[i] 13 minIndex = min(curlist) 14 maxIndex = max(curlist) 15 if minIndex != -1: 16 count += n - maxIndex 17 else: 18 break 19 return count
算法思路:字符串查询。
记录每一个字符串的当前位置向后,下一次'a'/'b'/'c'字符的索引。
每次计算当前位置三种字符下一个索引的最大值,从当前位置开始,到这个最大值这个子字符串是从这个起点开始的最短子串。
向后每次增加一个字符,都满足条件。
如果从当前位置向后,不再有下一个'a'/'b'/'c'字符,那么就停止循环(从这个字符作为起点,不再有满足条件的子串了)。