|  | @@ -79,13 +79,18 @@ func getPossibleTowers(patterns [][]string, towels []string) []string {
 | 
	
		
			
				|  |  |  	return possible
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -func checkTowel2(towel string, index int, patterns [][]string) int {
 | 
	
		
			
				|  |  | +func checkTowel2(towel string, index int, patterns [][]string, checked map[string]int, maxPatterns int) int {
 | 
	
		
			
				|  |  |  	var count int
 | 
	
		
			
				|  |  |  	if index >= len(towel) {
 | 
	
		
			
				|  |  |  		return 1
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	for _, pattern := range patterns[towel[index]-delta] {
 | 
	
		
			
				|  |  | +		if checked[patternAndIndex(pattern, index)] > maxPatterns {
 | 
	
		
			
				|  |  | +			continue
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		checked[patternAndIndex(pattern, index)]++
 | 
	
		
			
				|  |  |  		patternMatch := true
 | 
	
		
			
				|  |  |  		for i := range pattern {
 | 
	
		
			
				|  |  |  			if index+i >= len(towel) || pattern[i] != towel[index+i] {
 | 
	
	
		
			
				|  | @@ -95,17 +100,28 @@ func checkTowel2(towel string, index int, patterns [][]string) int {
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		if patternMatch {
 | 
	
		
			
				|  |  | -			count += checkTowel2(towel, index+len(pattern), patterns)
 | 
	
		
			
				|  |  | +			count += checkTowel2(towel, index+len(pattern), patterns, checked, maxPatterns)
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	return count
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +func getMax(patterns [][]string) int {
 | 
	
		
			
				|  |  | +	var maxPatterns int
 | 
	
		
			
				|  |  | +	for _, letter := range patterns {
 | 
	
		
			
				|  |  | +		maxPatterns += len(letter)
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	return maxPatterns
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  func part2(patterns [][]string, towels []string) int {
 | 
	
		
			
				|  |  |  	var count int
 | 
	
		
			
				|  |  |  	for _, towel := range towels {
 | 
	
		
			
				|  |  | -		count += checkTowel2(towel, 0, patterns)
 | 
	
		
			
				|  |  | +		maxPatterns := getMax(patterns)
 | 
	
		
			
				|  |  | +		checked := make(map[string]int)
 | 
	
		
			
				|  |  | +		count += checkTowel2(towel, 0, patterns, checked, maxPatterns)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	return count
 |