Jbears

Untitled

Nov 26th, 2021
1,147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.14 KB | None | 0 0
  1. class Solution:
  2.     def solve(self, text, patterns):
  3.         # pattern matches
  4.         patpos = []
  5.  
  6. # intervals
  7.         intervals = []
  8.  
  9. for i in range(len(text)):
  10.            
  11.             # find any patterns that match at the start
  12.             for j in range(len(patterns)):
  13.                 if text[i] == patterns[j][0]:
  14.                     patpos.append((j, 0))
  15.  
  16. new_patpos = []
  17.  
  18. # check if found patterns continue to match
  19.             for j in range(len(patpos)):
  20.                 (pat_idx, pos) = patpos[j]
  21.                 pattern = patterns[pat_idx]
  22.                
  23.                 if text[i] == pattern[pos]:
  24.                     # next pattern character matches
  25.                     new_pos = pos + 1
  26.  
  27. if new_pos == len(pattern):
  28.                         # the full pattern matches; save the interval
  29.  
  30. ival_start = (i - len(pattern)) + 1
  31.                         ival_end = i
  32.  
  33. intervals.append((ival_start, ival_end))
  34.                        
  35.                     else:
  36.                         # only part of the pattern matches (so far)
  37.                         new_patpos.append((pat_idx, new_pos))
  38.            
  39.             # roll over patterns that continued to match
  40.             patpos = new_patpos
  41.  
  42. if len(intervals) == 0:
  43.             return text
  44.  
  45. # merge intervals
  46.         intervals.sort()
  47.         new_intervals = [intervals[0]]
  48.  
  49. for i in range(1, len(intervals)):
  50.             (curr_start, curr_end) = intervals[i]
  51.             (prev_start, prev_end) = new_intervals[-1]
  52.  
  53. if curr_start <= prev_end + 1:
  54.                 new_intervals[-1] = (prev_start, max(curr_end, prev_end))
  55.             else:
  56.                 new_intervals.append((curr_start, curr_end))
  57.  
  58. print(new_intervals)
  59.  
  60. # apply tags
  61.         ans = ''
  62.         ival_idx = 0
  63.         for i in range(len(text)):
  64.             if ival_idx >= len(new_intervals):
  65.                 ans += text[i]
  66.             else:
  67.                 (ival_start, ival_end) = new_intervals[ival_idx]
  68.                 if i == ival_start:
  69.                     ans += '<b>'
  70.  
  71. ans += text[i]
  72.  
  73. if i == ival_end:
  74.                     ans += '</b>'
  75.                     ival_idx += 1
  76.  
  77. return ans
  78.  
  79.  
Advertisement
Add Comment
Please, Sign In to add comment