From a0ce59f41fa42b5eb9af58443596769da2af357b Mon Sep 17 00:00:00 2001 From: Vitor Oliveira Date: Sun, 16 May 2021 22:10:31 -0700 Subject: [PATCH 1/3] Count sorted vowel strings: dynamic programming --- .../count_sorted_vowel_strings.rb | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) create mode 100644 dynamic_programming/count_sorted_vowel_strings.rb diff --git a/dynamic_programming/count_sorted_vowel_strings.rb b/dynamic_programming/count_sorted_vowel_strings.rb new file mode 100644 index 0000000..0696006 --- /dev/null +++ b/dynamic_programming/count_sorted_vowel_strings.rb @@ -0,0 +1,80 @@ +# 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 +# + +# @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 From fba17c66e968279bc00a33bc340f9fb88d63f1f2 Mon Sep 17 00:00:00 2001 From: github-actions <${GITHUB_ACTOR}@users.noreply.github.com> Date: Mon, 17 May 2021 05:10:48 +0000 Subject: [PATCH 2/3] updating DIRECTORY.md --- DIRECTORY.md | 1 + 1 file changed, 1 insertion(+) diff --git a/DIRECTORY.md b/DIRECTORY.md index 15bcf9f..93c812b 100644 --- a/DIRECTORY.md +++ b/DIRECTORY.md @@ -64,6 +64,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 From 0884b95d4e1965487c813b1dd84b86156cd3853f Mon Sep 17 00:00:00 2001 From: Vitor Oliveira Date: Sun, 16 May 2021 22:12:36 -0700 Subject: [PATCH 3/3] add short explanation --- dynamic_programming/count_sorted_vowel_strings.rb | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/dynamic_programming/count_sorted_vowel_strings.rb b/dynamic_programming/count_sorted_vowel_strings.rb index 0696006..e6a9fbe 100644 --- a/dynamic_programming/count_sorted_vowel_strings.rb +++ b/dynamic_programming/count_sorted_vowel_strings.rb @@ -30,6 +30,17 @@ # 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}