@@ -43,6 +43,15 @@ def maxNumOfSubstrings(self, s):
43
43
:type s: str
44
44
:rtype: List[str]
45
45
"""
46
+ def find_right_from_left (s , first , last , left ):
47
+ right , i = last [ord (s [left ])- ord ('a' )], left
48
+ while i <= right :
49
+ if first [ord (s [i ])- ord ('a' )] < left :
50
+ return - 1
51
+ right = max (right , last [ord (s [i ])- ord ('a' )])
52
+ i += 1
53
+ return right
54
+
46
55
first , last = [float ("inf" )]* 26 , [float ("-inf" )]* 26
47
56
for i , c in enumerate (s ):
48
57
first [ord (c )- ord ('a' )] = min (first [ord (c )- ord ('a' )], i )
@@ -51,13 +60,8 @@ def maxNumOfSubstrings(self, s):
51
60
for c in xrange (len (first )):
52
61
if first [c ] == float ("inf" ):
53
62
continue
54
- left , right = first [c ], last [c ]
55
- i = left
56
- while i <= right :
57
- left = min (left , first [ord (s [i ])- ord ('a' )])
58
- right = max (right , last [ord (s [i ])- ord ('a' )])
59
- i += 1
60
- if left == first [c ]:
63
+ left , right = first [c ], find_right_from_left (s , first , last , first [c ])
64
+ if right != - 1 :
61
65
intervals .append ((right , left ))
62
66
intervals .sort () # Time: O(26log26)
63
67
result , prev = [], - 1
0 commit comments