mirror of
https://github.com/TheAlgorithms/Ruby
synced 2024-12-26 21:58:56 +01:00
Merge pull request #152 from TheAlgorithms/count-sorted-vowel-strings-dd-memoization
This commit is contained in:
commit
d71a41556f
2 changed files with 92 additions and 0 deletions
|
@ -74,6 +74,7 @@
|
|||
|
||||
## Dynamic Programming
|
||||
* [Coin Change](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/coin_change.rb)
|
||||
* [Count Sorted Vowel Strings](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/count_sorted_vowel_strings.rb)
|
||||
* [Fibonacci](https://github.com/TheAlgorithms/Ruby/blob/master/dynamic_programming/fibonacci.rb)
|
||||
|
||||
## Maths
|
||||
|
|
91
dynamic_programming/count_sorted_vowel_strings.rb
Normal file
91
dynamic_programming/count_sorted_vowel_strings.rb
Normal file
|
@ -0,0 +1,91 @@
|
|||
# Challenge name: Count Sorted Vowel Strings
|
||||
#
|
||||
# Given an integer n, return the number of strings of length n that consist only
|
||||
# of vowels (a, e, i, o, u) and are lexicographically sorted.
|
||||
#
|
||||
# A string s is lexicographically sorted if for all valid i, s[i] is the same as
|
||||
# or comes before s[i+1] in the alphabet.
|
||||
#
|
||||
#
|
||||
# Example 1:
|
||||
#
|
||||
# Input: n = 1
|
||||
# Output: 5
|
||||
# Explanation: The 5 sorted strings that consist of vowels only are ["a","e","i","o","u"].
|
||||
#
|
||||
# Example 2:
|
||||
#
|
||||
# Input: n = 2
|
||||
# Output: 15
|
||||
# Explanation: The 15 sorted strings that consist of vowels only are
|
||||
# ["aa","ae","ai","ao","au","ee","ei","eo","eu","ii","io","iu","oo","ou","uu"].
|
||||
# Note that "ea" is not a valid string since 'e' comes after 'a' in the alphabet.
|
||||
#
|
||||
# Example 3:
|
||||
#
|
||||
# Input: n = 33
|
||||
# Output: 66045
|
||||
|
||||
#
|
||||
# Approach: Using Recursion + Memoization, Top Down Dynamic Programming
|
||||
#
|
||||
|
||||
#
|
||||
# Algorithm: Dynamic Programming state transition.
|
||||
#
|
||||
# F(0) = 1
|
||||
# F(n)a = F(n-1)a + F(n-1)e + F(n-1)i + F(n-1)o +F(n-1)u
|
||||
# F(n)e = F(n-1)e + F(n-1)i + F(n-1)o + F(n-1)u
|
||||
# F(n)i = F(n-1)i + F(n-1)o +F(n-1)u
|
||||
# F(n)o = F(n-1)o + F(n-1)u
|
||||
# F(n)u = F(n-1)u
|
||||
#
|
||||
|
||||
# @param {Integer} n
|
||||
# @return {Integer}
|
||||
|
||||
def count_vowel_strings(n, letter = 'a')
|
||||
return 1 if n < 1
|
||||
|
||||
@h ||= {}
|
||||
key = [n, letter]
|
||||
return @h[key] if @h[key]
|
||||
|
||||
result = case letter
|
||||
when 'a'
|
||||
count_vowel_strings(n - 1, letter = 'a') +
|
||||
count_vowel_strings(n - 1, letter = 'e') +
|
||||
count_vowel_strings(n - 1, letter = 'i') +
|
||||
count_vowel_strings(n - 1, letter = 'o') +
|
||||
count_vowel_strings(n - 1, letter = 'u')
|
||||
when 'e'
|
||||
count_vowel_strings(n - 1, letter = 'e') +
|
||||
count_vowel_strings(n - 1, letter = 'i') +
|
||||
count_vowel_strings(n - 1, letter = 'o') +
|
||||
count_vowel_strings(n - 1, letter = 'u')
|
||||
when 'i'
|
||||
count_vowel_strings(n - 1, letter = 'i') +
|
||||
count_vowel_strings(n - 1, letter = 'o') +
|
||||
count_vowel_strings(n - 1, letter = 'u')
|
||||
when 'o'
|
||||
count_vowel_strings(n - 1, letter = 'o') +
|
||||
count_vowel_strings(n - 1, letter = 'u')
|
||||
when 'u'
|
||||
count_vowel_strings(n - 1, letter = 'u')
|
||||
end
|
||||
|
||||
@h[key] = result
|
||||
@h[key]
|
||||
end
|
||||
|
||||
n = 33
|
||||
puts count_vowel_strings(n)
|
||||
# Output: 66045
|
||||
|
||||
n = 2
|
||||
puts count_vowel_strings(n)
|
||||
# Output: 15
|
||||
|
||||
n = 1
|
||||
puts count_vowel_strings(n)
|
||||
# Output: 5
|
Loading…
Reference in a new issue